我偶然发现了string::substr的奇怪行为。通常我在 Eclipse+MinGW 中的Windows 7上进行编码,但是当我在笔记本电脑上工作时,在Linux(Ubuntu 12.04)中使用 Eclipse 时,我注意到结果有所不同。
我正在使用填充了文本行的向量<字符串> 。其中一个步骤是从行中删除最后一个字符。
在win7 Eclipse中我做了:
for( int i = 0; i < (int)vectorOfLines.size(); i++ )
{
vectorOfTrimmedLines.push_back( ((string)vectorOfLines.at(i)).substr(0, ((string)vectorOfLines.at(i)).size()-1) );
}
它按预期工作(从每一行中删除最后一个字符)
但在 Linux 中,此代码不会修剪。相反,我需要这样做:
// -2 instead -1 character
vectorOfTrimmedLines.push_back( ((string)vectorOfLines.at(i)).substr(0, ((string)vectorOfLines.at(i)).size()-2) );
或使用另一种方法:
vectorOfTrimmedLines.push_back( ((string)vectorOfLines.at(i)).replace( (((string)vectorOfLines.at(i)).size()-2),1,"",0 ));
当然,Linux 方法在 Windows 上的工作方式是错误的(修剪 2 个最后一个字符,或在最后一个之前替换一个)。
问题似乎是 myString.size() 在 Windows 中返回字符数,但在 Linux 中它返回字符数 + 1。难道是换行符在 Linux 上被计算?
作为 C++ 和一般编程的新手,我想知道为什么会这样,以及如何做到独立于平台。
我想知道的另一件事是:哪种方法更可取(更快)substr或replace?
编辑:用于填充字符串的方法我写了这个函数:
vector< string > ReadFile( string pathToFile )
{
// opening file
ifstream myFile;
myFile.open( pathToFile.c_str() );
// vector of strings that is returned by this function, contains file line by line
vector< string > vectorOfLines;
// check if the file is open and then read file line by line to string element of vector
if( myFile.is_open() )
{
string line; // this will contain the data read from current the file
while( getline( myFile, line ) ) // until last line in file
{
vectorOfLines.push_back( line ); // add current line to new string element in vector
}
myFile.close(); // close the file
}
// if file does not exist
else
{
cerr << "Unable to open file." << endl; // if the file is not open output
//throw;
}
return vectorOfLines; // return vector of lines from file
}