2013-02-28 111 views
1

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

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”出现的事实引起的。

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

+1

的字节在文件的开头是一个Unicode [字节顺序标记] (http://en.wikipedia.org/wiki/Byte_order_mark),表示文本文件以UTF-16(LE)编码。你是如何创建文本文件的?用文本编辑器?你的项目中是否需要Unicode功能? – nwellnhof 2013-02-28 11:03:48

回答

2

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

“云天化” 是0xFFFE,则UTF-16 “小尾” 字节顺序标记。 “2”是你的第一个实际字符(对于UTF-16,低于256的字符将由for 0xnn00 ;,其中“nn”是该字符通常的ASCII或UTF-8代码表示,所以某些尝试以ASCII或UTF-8的形式读取字节,直到达到第一个空字节为止)。

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

Unipad将能够打开该文件,让您保存它任何你想要的编码:ASCII,UTF-8等