2013-04-20 3 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, используя жестко закодированные имена файлов, он отлично работает. Когда я использую аргумент командной строки в linux после использования g ++, он может правильно открыть файлы, но после этого у него много ошибок. Для того, чтобы проверить чтение файла, я напечатал некоторые из считанного, что привело к

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

Появление here обусловлено фактически печататься в программе. Это не связано с ошибкой, я вручную распечатал ее для проверки кода.

Кажется, что вы не можете правильно прочитать данные. В файле для cityFile всегда есть 4 значения в каждой строке, каждая из которых разделяется одной командой, без пробелов, а новый символ линии разделяет строки в файле. Как я уже сказал выше, он отлично работает в Visual Studio, поэтому я не думаю, что это проблема с фактическими данными, просто прочитав его.

+0

Когда происходит ошибка? –

+0

Если я попытаюсь прочитать информацию, она неправильно истолковывает это как показанное. Затем, когда я обращаюсь к различным структурам данных, использующим его, он выдает исключение из границ. Ошибка не возникает, если я жестко кодирует имена файлов. –

ответ

0

Linux и окно имеют новый символ новой строки. Linux '\ n', windows '\ r \ n'. Если вы просто скопировали файл в linux, вам необходимо обработать его в своей программе. Вы можете посмотреть Mixing cin and getline under Linux and Windows в качестве ссылки.

+0

Я думал, что getline без третьего аргумента автоматически использует '\ n' в качестве разделителя. –

0

Если вы просто переместили файлы Windows в Linux, проверьте инструмент dos2unix, чтобы преобразовать файл и исправить окончания строки. «EOL» в вашем выходе является признаком того, что что-то может быть не так с окончанием.

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

+0

Когда я использую команду 'dos2unix route.txt route1.txt', он возвращает код ошибки 2, говоря, что route.txt не является обычным файлом. –

Смежные вопросы