我正忙于编写通用文本文件阅读器类,我正在努力编写代码以正确处理Mac,Linux和Windows的行尾(EOL)字符。
我已经对这个问题进行了一些阅读,我在TextFileReader类中提出了以下函数来删除EOL字符,一旦我使用getline()读取文本文件的内容并将字符串存储在地图。
//! Strip End-Of-Line characters.
void TextFileReader::stripEndOfLineCharacters( )
{
// Search through container of data and remove newline characters.
string::size_type stringPosition_ = 0;
string searchString_ = "\r";
string replaceString_ = "";
for ( unsigned int i = 0; i < 1; i++ )
{
for ( iteratorContainerOfDataFromFile_
= containerOfDataFromFile_.begin( );
iteratorContainerOfDataFromFile_
!= containerOfDataFromFile_.end( );
iteratorContainerOfDataFromFile_++ )
{
while ( ( stringPosition_ = iteratorContainerOfDataFromFile_
->second.find( searchString_,
stringPosition_ ) ) != string::npos )
{
// Replace search string with replace string.
iteratorContainerOfDataFromFile_->second
.replace( stringPosition_, searchString_.size( ),
replaceString_ );
// Advance string position.
stringPosition_++;
}
}
// Switch search string.
searchString_ = "\n";
}
}
我认为这会消除跨平台的所有EOL角色,但似乎并非如此。它在我的Mac上正常运行,运行Mac OS 10.5.8。它似乎不适用于Windows系统。奇怪的是,在运行此功能的Windows系统上剥离地图中第一个字符串的EOL字符,其余字符仍然是一个字符太长。
这让我想到也许我不能只替换“\ r”和“\ n”字符,但我读到的所有内容都表明它是Windows用来表示EOL字符的两者的组合。
为了使其更加明确,这里是我试图做的一步一步的布局。我有两个文本文件,名为testFileMadeWithWindows.txt和testFileMadeWithMac.txt。
在Windows计算机上使用记事本打开第一个文件,它包含以下内容。
这是第1行。
这是第2行。
这是第3行。
在Mac上使用TextEdit打开第二个文件,它包含以下内容。
这是第1行。
这是第2行。
这是第3行。
换句话说,两个文件的文件内容是相同的。我想使用我的FileReader类读取这两个文件并将字符串存储在地图中。为此,我使用了getline()函数。
当我使用getline()读入testFileMadeWithWindows.txt时,结果是字符串大小如下:
16
16
15
同样,当我使用getline()读入testFileMadeWithMac.txt时,结果是字符串大小如下:
16
16
15
我现在执行我在包含此数据的地图上的第一篇文章中发布的stripEndOfLineCharacters()函数。
对于testFileMadeWithWindows.txt,这会产生以下字符串大小:
15
16
15
对于testFileMadeWithMac.txt,这会产生以下字符串大小:
15
15
15
我使用string :: compare比较我从textfiles中读入的字符串和预期的字符串数据,它应该是:
这是第1行。
这是第2行。
这是第3行。
Windows比较失败,特别是与第二行的比较失败。所有三个字符串的Mac比较都是成功的。我想知道如何解决这个问题,以便Windows比较成功。
任何输入都将不胜感激。提前谢谢!
卡尔蒂克
答案 0 :(得分:0)
执行此操作的最佳方法是始终以文本模式打开您的fstream(即,没有fstream :: binary),这样EOL(无论它们可能在当前平台上)将被转换为单个'\ n '你的角色,这就是你需要担心的......