在C ++中处理跨平台字符跨平台

时间:2011-05-11 00:51:34

标签: cross-platform text-files character end-of-line

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

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

卡尔蒂克

1 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是始终以文本模式打开您的fstream(即,没有fstream :: binary),这样EOL(无论它们可能在当前平台上)将被转换为单个'\ n '你的角色,这就是你需要担心的......