1

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クレイジーな負のガベージ値が得られていることがわかりました。これは、最初の行から読むと「2」になるはずの「num」が、実際には「ÿþ2」になっていることが原因のようです。

少し調査したところ、これらの奇妙な文字は書式設定されているようです...おそらく Unicode/Mac 固有ですか? いずれにせよ、それらは問題であり、Mac で作成したテキスト ファイルを連携させ、Windows で Mac ターミナルと同じように動作させるための迅速かつ簡単な方法があるかどうか疑問に思っています。UNIXマシンに接続して、そこにtxtファイルを置き、unix2dosを実行して、VSに戻そうとしましたが、役に立ちませんでした...それでも行頭にそれらのシンボルがあります! Windows で入力ファイルを最初からやり直す必要がありますか? さまざまなプラットフォームのファイル内の文字に関して、目に見えるものと必ずしも得られるものとは限らないことを知って非常に驚いています...しかし、良い教訓になると思います.

4

1 に答える 1

2

コメンターが示したように、表示されているバイトはバイトオーダーマークです。http://en.wikipedia.org/wiki/Byte_order_markを参照してください。

「ÿþ」は 0xFFFE で、UTF-16 の「リトル エンディアン」バイト オーダー マークです。「2」は最初の実際の文字です (UTF-16 の場合、256 未満の文字は 0xnn00 のバイトで表されます。ここで、「nn」はその文字の通常の ASCII または UTF-8 コードです。最初の null バイトに到達するまで、バイトを ASCII または UTF-8 として読み取ります)。

テキスト ファイルの Unicode の詳細を解明する必要がある場合、私が知っている最良のツールは無料の SC Unipad エディター (www.unipad.org) です。これは Windows 専用ですが、ほぼすべてのエンコーディングを読み書きでき、ファイルについて知っておくべきことを教えてくれます。エンコーディングの推測が非常に得意です。

Unipad でファイルを開くことができ、ASCII、UTF-8 など、任意のエンコーディングで保存できます。

于 2013-03-02T12:57:09.767 に答える