我正忙于编写一个通用的文本文件阅读器类,我正在努力编写代码以正确处理 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 将我从文本文件中读取的字符串与预期的字符串数据进行比较,这应该是:
这是第 1 行。
这是第 2 行。
这是第 3 行。
Windows 比较失败,特别是与第二行的比较失败。Mac 比较对于所有三个字符串都是成功的。我想知道如何解决这个问题,以便 Windows 比较也成功。
任何输入将不胜感激。提前致谢!
卡提克