0

私のプログラムでは、次のコードを使用して、コマンド ライン引数から 2 つのファイル名を取得します。

ifstream routesFile (arv[1]);
ifstream citiesFile (arv[2]);

次に、ファイルを読み込んでデータを取得します。どちらのファイルも CSV です。

while(citiesFile.good()){
        string city;
        string country;
        string xString;
        string yString;
        getline(citiesFile, country, ',');
        getline(citiesFile, city, ',');
        getline(citiesFile, xString, ',');
        getline(citiesFile, yString);
...
}

ハードコーディングされたファイル名を使用して Visual Studio でこれを行うと、正常に動作します。g++ を使用した後、Linux でコマンド ライン引数を使用すると、ファイルを正しく開くことができますが、その後、多くのエラーが発生します。ファイルの読み取りをテストするために、読み取り値の一部を出力しました。

terminate called after throwing an instance of 'std::out_of_range'
  what():  map::at
hereELF
Òœc½Å¹jn!ýô (EÕL˜C

の外観はhere、実際にプログラムで印刷されているためです。エラーが原因ではありません。コードをテストするために手動で印刷しました。

データを正しく読み取れないようです。citysFile のファイルには、1 行につき常に 4 つの値があり、それぞれが 1 つのコマンドで区切られています。スペースは使用せず、改行文字でファイル内の行を区切ります。上で述べたように、Visual Studio では問題なく動作するので、実際のデータを読み取るだけでは問題ないと思います。

4

2 に答える 2

0

Linux とウィンドウでは改行記号が異なります。Linux '\n'、Windows '\r\n'。ファイルを Linux にコピーしたばかりの場合は、プログラムでこれらを処理する必要があります。Linux と Windows での cin と getline の混合 を参考にしてください。

于 2013-04-20T02:56:56.310 に答える
0

Windows ファイルを Linux に移動しただけの場合は、ツールdos2unixを調べてファイルを変換し、行末を修正してください。出力の「EOL」は、エンディングに問題がある可能性があることを示しています。

http://www.linuxcommand.org/man_pages/dos2unix1.html

于 2013-04-20T02:58:57.177 に答える