1

我正忙于编写一个通用的文本文件阅读器类,我正在努力编写代码以正确处理 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 比较也成功。

任何输入将不胜感激。提前致谢!

卡提克

4

1 回答 1

0

最好的方法是始终以文本模式打开您的 fstream(即,没有 fstream::binary),这样 EOL(无论它们在当前平台上可能是什么)将被转换为单个 '\n' 字符你,这就是你所要担心的...

于 2011-05-11T01:18:46.407 回答