我在我的苹果电脑上创建了一些.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“。
从一些研究,似乎这些奇怪的字符格式things...perhaps unicode/Mac特定?无论如何,它们都是一个问题,我想知道是否有一种快速简单的方法,可以让我在Mac上创建的文本文件在Windows中像在Mac终端中一样协同工作。我尝试连接到一台UNIX机器,在那里放入一个txt文件,在上面运行unix2dos,然后放回VS中,但是没有avail...still行开头的那些符号!我应该在Windows中重新创建我的输入文件吗?我非常惊讶地了解到,当涉及到跨platforms...but的文件中的字符时,你看到的并不总是你所得到的,我想这是一个很好的教训。
发布于 2013-03-02 20:57:10
正如评论者所指出的,您看到的字节是字节顺序标记。参见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等。
https://stackoverflow.com/questions/15127535
复制相似问题