2013-04-20 31 views
0

阅读文件在我的计划,我从使用下面的代码的命令行参数两个文件名:错误在Linux中

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

何时发生错误? – 2013-04-20 02:51:42

+0

如果我尝试阅读信息,它会将其误解为显示的内容。然后当我访问使用它的各种数据结构时,它会抛出异常。如果我对文件名进行硬编码,则不会发生该错误。 – 2013-04-20 02:52:57

回答

0

Linux和窗口有不同的新行符号。 Linux'\ n',windows'\ r \ n'。如果您只是将文件复制到Linux中,则需要在程序中处理这些文件。你可以看看Mixing cin and getline under Linux and Windows作为参考。

+0

我认为没有第三个参数的getline自动使用'\ n'作为它的分隔符。 – 2013-04-20 03:00:08

0

如果您只是将Windows文件移动到Linux,请检查工具dos2unix来转换文件并修复行尾。输出中的“EOL”表示结尾可能有错误。

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

+0

当我使用命令'dos2unix route.txt route1.txt'时,它返回一个错误代码2,表示route.txt不是一个普通的文件。 – 2013-04-20 03:07:11