Полученная строку из Sprintf имеет различный порядок значений, чем пройденный Одер параметров на сервере Ubuntu

голоса
0

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

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

worcester_000187
worcester_000192
worcester_000193
worcester_000194
worcester_000196
worcester_000197
worcester_000198

То, что я обнаружил, что если я назначу «имя файла» строковую переменную с жестким закодированных значений говорят:

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

}
Задан 19/01/2014 в 20:50
источник пользователем
На других языках...                            


1 ответов

голоса
1

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

  1. Текстовый файл , написанный на окнах (я писал текстовый файл в Windows) принимает CR и LF (\ г \ п) как линия заканчивается.
  2. Linux и Unix рассматривает только LF (\ п) как линия заканчивается.
  3. При работе в Linux GetLine () определяет \ п для обнаружения конца строки и имени файла получает «worcester_000187 \ г» в качестве значения. Добавлено уведомление возврат каретки дополнительной.
  4. После выписки Sprintf (FileName, "% S% s.txt", Map_PATH, filename.c_str ()) может быть оценена в двух шагах т.е. до и после того, как мы достигаем до '.txt'

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

  6. Теперь мы добавим .txt и курсор находится в начале и , следовательно , он переписывает первые четыре символа в «имя_файла» массива. Я надеюсь , что это имеет смысл.

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

Ответил 20/01/2014 в 21:01
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more