本文介绍了Windows和Linux文本文件处理故障的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

// 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行结尾,那么您的程序将必须处理回车,但至少您将看到一致的行为。)

这篇关于Windows和Linux文本文件处理故障的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-19 06:39