2013-02-28 65 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等