在我的程序中,我使用以下代码从命令行参数中获取两个文件名:
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
的外观是由于实际打印在程序中。它不是由错误引起的,我手动打印它来测试代码。
似乎无法正确读取数据。在citiesFile的文件中,每行总有4个值,每个值由一个命令分隔,没有空格,新的行字符分隔文件中的行。正如我上面所说,它在Visual Studio中运行良好,所以我不认为它是实际数据的问题,只是阅读它。
答案 0 :(得分:0)
Linux和窗口有不同的新行符号。 Linux' \ n',windows' \ r \ n'。如果你刚刚将文件复制到linux中,则需要在程序中处理这些文件。您可以查看Mixing cin and getline under Linux and Windows作为参考。
答案 1 :(得分:0)
如果您只是将Windows文件移动到Linux,请查看工具 dos2unix 以转换文件并修复行结尾。输出中的“EOL”表示结尾可能有问题。