результирующая строка из sprintf имеет другой порядок значений, чем передаваемый порядок параметров на сервере Ubuntu

0

Я читаю имена файлов, написанные в текстовом файле, в строковый вектор. Для каждого имени файла я хочу создать его полный путь, чтобы я мог его прочитать. Для конечного пути я объединяю переменные 'Map_PATH' и 'filenames' вместе в FileName (массив символов), используя функцию sprintf.

Теперь в окнах его файлы FileName содержат "/data2/worcester_000187.txt", который мне нужен. Но запуск на сервере Ubuntu дает результат ".txta2/worcester_000187", вместо этого он частично перезаписывает данные2. Текстовый файл содержит имена файлов, подобные этому, т.е. одно имя в каждой строке:

worcester_000187
worcester_000192
worcester_000193
worcester_000194
worcester_000196
worcester_000197
worcester_000198

То, что я обнаружил, что если я назначу строчную переменную 'filename' с жестко закодированными значениями, скажите:

filename="worcester_000187"; 

Я получаю правильные результаты. Но это создает проблему, когда одна и та же переменная имени файла получает строковые значения, считанные из текстового файла. Либо есть проблема с чтением с файлом.

Ниже приведено краткое изложение кода:

char FileName[500];
char Map_PATH[]="/data2/";
vector < string > fileList;
string filename;
fstream fp;

fp.open ("ImagesListTemp.txt", ios::in);
if(!fp.is_open())
{
cerr <<"Unable to open Image Names List: "<<endl;
exit(1);
}


while (getline(fp, filename)) 
{
fileList.push_back(filename);
}
fp.close();



for(int i=0;i<fileList.size();i++)
{
 filename=fileList[i];
 //    filename="worcester_000187"; 
 sprintf(FileName,"%s%s.txt",Map_PATH,filename.c_str()); 
 // Open File and do some operations

}
  • 2
    это большая смесь между C и C ++ :(
  • 0
    Сделал некоторые изменения. Все еще имеет ту же проблему.
Показать ещё 4 комментария
Теги:
file-io
printf

1 ответ

1
Лучший ответ

Как и ожидалось, проблема связана с текстовым файлом. Вот что происходило.

  1. Текстовый файл, написанный в окнах (я написал текстовый файл в окнах), принимает CR и LF (\ r\n) в качестве окончания строки.
  2. Linux и Unix рассматривает только LF (\n) как завершение строки.
  3. При работе в Linux getline() обнаруживает \n для обнаружения конца строки, а имя файла получает значение "worcester_000187\r". Обратите внимание на добавление дополнительного возврата каретки.
  4. Следующий оператор sprintf (FileName, "% s% s.txt", Map_PATH, filename.c_str()) может быть оценен в два этапа, т.е. до и после того, как мы дойдем до '.txt'

  5. Перед '.txt' FileName содержит '/data2/worcester_000187\r'. Теперь '\ r' снова возвращает нас к началу этой строки.

  6. Теперь мы добавляем .txt, и курсор находится в начале и, следовательно, он перезаписывает первые четыре символа в массиве FileName. Надеюсь, это имеет смысл.

Использование команды dos2unix преобразует текстовый файл в желаемый формат.

  • 1
    Хм, противный. Решив, однако, я бы сделал платформу для чтения файлов независимой, явно протестировав n \r и удалив, если найден.
  • 0
    Следующий пост предлагает очень хорошее решение для этого. stackoverflow.com/questions/6089231/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню