【问题标题】:Issues with getline/file reading in WindowsWindows 中的 getline/文件读取问题
【发布时间】:2013-02-14 04:07:16
【问题描述】:

我在我的 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 上创建的文本文件像在 Mac 终端中一样在 Windows 中协作和运行。我尝试连接到一台 UNIX 机器,在其中放置一个 txt 文件,在其上运行 unix2dos,然后放回 VS,但无济于事……仍然是行首的那些符号!我应该在 Windows 中重新输入文件吗?我很惊讶地发现,当涉及到跨平台文件中的字符时,您所看到的并不总是您所得到的……但我想这是一个很好的教训。

【问题讨论】:

  • 文件开头的字节为UnicodeByte Order Mark,表示文本文件采用UTF-16(LE)编码。你是如何创建文本文件的?用文本编辑器?您的项目中需要 Unicode 功能吗?

标签: visual-studio file-io unicode getline


【解决方案1】:

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

“ÿþ”是 0xFFFE,UTF-16“小端”字节顺序标记。 “2”是您的第一个实际字符(对于 UTF-16,低于 256 的字符将由 0xnn00; 的字节表示,其中“nn”是该字符的常用 ASCII 或 UTF-8 代码,所以试图以 ASCII 或 UTF-8 格式读取字节,直到它到达第一个空字节)。

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

Unipad 将能够打开文件并让您将其保存为您想要的任何编码:ASCII、UTF-8 等。

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2019-08-07
    • 2023-03-04
    • 1970-01-01
    • 2023-03-17
    • 2015-01-21
    相关资源
    最近更新 更多