在Windows中读取getline /文件的问题

时间:2013-02-28 04:29:37

标签: visual-studio file-io unicode getline

我在我的Mac上创建了一些.txt文件(起初并不认为这很重要,但是......)这样我就可以在不同的计算机上制作的应用程序(不幸的是)Visual Studio中读取它们。它们基本上是用记录填充的文件,每行的条目数在顶部,例如:

2
int int 
age name
9 Bob
34 Mary
12 Jim
... 

在我最初刚刚在Mac上制作(并成功测试)的代码中,我尝试读取此文件及类似文件:

Table TableFromFile(string _filename){ //For a database system

  ifstream infile; 
  infile.open(_filename.c_str()); 

  if(!infile){
    cerr << "File " << _filename << " could not be opened."; 
    exit(1); 
  }

  //Determine number attributes (columns) in table, 
  //which is number on first line of input file 
  std::string num;
  getline(infile, num); 
  int numEntries = atoi(num.c_str()); 
  ...
  ... 

简而言之,这会导致崩溃!当我调查它时,我发现了一些有趣的“读取字符串字符的错误”问题,并发现numEntries正在获得一些疯狂的负垃圾值。这似乎是由于“num”(从第一行读取的“2”)实际上是“ÿþ2”的事实引起的。

从一个小小的研究来看,似乎这些奇怪的字符都是格式化的东西......也许是unicode / Mac特有的?在任何情况下,它们都是一个问题,我想知道是否有一种快速简便的方法可以让我在Mac上创建的文本文件在Windows中与在Mac终端中一样在Windows中进行合作和行为。我尝试连接到UNIX机器,在那里放置一个txt文件,在其上运行unix2dos,然后放回到VS中,但无济于事......仍然是那行符号的开头!我应该在Windows中重新输入我的输入文件吗?我很惊讶地发现,你所看到的并不总是你在跨平台文件中的角色所得到的......但我认为这是一个很好的教训。

1 个答案:

答案 0 :(得分:2)

正如评论者指出的那样,您看到的字节是字节顺序标记。见http://en.wikipedia.org/wiki/Byte_order_mark

“ÿþ”是0xFFFE,UTF-16“little endian”字节顺序标记。 “2”是你的第一个实际字符(对于UTF-16,256以下的字符将由for 0xnn00的字节表示;其中“nn”是该字符的通常ASCII或UTF-8代码,所以试图尝试读取字节为ASCII或UTF-8将一直运行,直到它到达第一个空字节)。

如果你需要弄清楚文本文件的Unicode细节,我所知道的最好的工具是免费的SC Unipad编辑器(www.unipad.org)。它只是Windows,但几乎可以读写任何编码,并且能够告诉您有关该文件的信息。它非常擅长猜测编码。

Unipad将能够打开该文件,并允许您以任何所需的编码保存它:ASCII,UTF-8等。