Windows和Linux文本文件处理故障

人气:517 发布:2022-10-16 标签: text-files ubuntu linux c++

问题描述

好的,这是我在处理文本文件时遇到的一个奇怪的跨平台问题。假设我有一个非常简单地读取文本文件的程序

// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("example.txt");
  if (myfile.is_open())
  {
    while ( myfile.good() )
    {
      getline (myfile,line);
      if (line == "BEGIN")
        cout << line << endl;
    }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;
}

这将读取一个文本文件,并在遇到BEGIN时显示正在读取的行。下面是我正在阅读的文本文件:

HEADER
BEGIN
X 2
Y 2
Z 1
END
Windows成功地输出了一次BEGIN,因为它只遇到了一次。Linux没有吐出任何东西。我在这里遗漏了什么基本的东西吗?

推荐答案

如果文件有Windows行结尾(即每行都以回车符+换行符结束,而不是像linux期望的那样只以换行符结束),则line在linux上将是"BEGIN",而不是"BEGIN"

要解决此问题,您可以对该文件运行dos2unix,将其转换为Linux行尾:

dos2unix example.txt

或者,如果您希望文件在两个系统上相同,您可以以二进制模式而不是文本模式打开它:

  ifstream myfile ("example.txt", ios_base::binary);

然后两个系统将以相同的方式读取文件。(如果它使用Windows行结尾,那么您的程序将必须处理回车,但至少您将看到一致的行为。)

136