У меня возникла проблема с чтением txt-файла в dll-файле Windows NT 4.0; и прежде чем вы спросите, в настоящее время я не заинтересован в переносе этого на новую ОС. Я просто хочу исправить эту проблему и позволить другим после меня беспокоиться о переносе этого сверхустаревшего программного обеспечения.
Проблема возникает, когда я читаю текстовый файл с помощью fscanf, как показано ниже:
infile_ptr = fopen("c:\\LumaGem\\orbit.txt", "r");
byteoffset=0;
while(!feof(infile_ptr) )
{
r=0.0; s1=0.0; s2=0.0; e1=0.0; e2=0.0; e3=0.0; d=0.0; f=0.0;
fseek(infile_ptr, byteoffset, SEEK_SET);
fscanf(infile_ptr,"%7lf %7lf %7lf %7lf %7lf %7lf %7lf %7lf", &r, &s1, &s2, &e1, &e2, &e3, &d, &f);
byteoffset=0; byteoffset = ftell(infile_ptr);
}
fclose(infile_ptr);
Текстовый файл, созданный с помощью MATLAB, состоит из 128 строк по 8 столбцов, разделенных 5 пробелами и отформатированных в MATLAB следующим образом:
fprintf(fid,'%7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f \n', variables);
Этот код был написан не мной и работал несколько лет. Однако недавно нам пришлось переустановить/переустановить ОС и программное обеспечение Windows NT 4.0, и теперь я получаю странную ошибку. Программа нормально читает txt-файл, используя код, представленный вверху, пока не дойдет до строки 123, после чего она дважды читает 8-й столбец, в результате чего все последующие переменные сдвигаются на одну позицию, полностью искажая последнюю. несколько строк программы. Интересно, что эту проблему можно решить, вручную скопировав и вставив первые 123 строки в новый текстовый файл, а затем несколько последних строк одну за другой в тот же новый текстовый файл и используя его в качестве входных данных (копирование выполнено). на машине NT в WordPad). Это устраняет проблему двойного чтения. Я понятия не имею, какие проблемы могут вызвать эту ошибку, но пусть она будет исправлена таким странным/неуклюжим методом. Проблема возникает с новыми и старыми входными данными, поэтому я не думаю, что проблема заключается во входных файлах, поскольку они не изменились.
О, и, кроме того, если я изменю количество пробелов между каждым столбцом в txt-файле, местоположение ошибки сместится. Уменьшение его до 1 пробела приводит к возникновению ошибки в строке 120 или около того, а увеличение количества пробелов (пробовал 7 вместо 5) привело к ошибке до строки 124.
Я не эксперт по программированию (всегда был парнем, который учится по мере необходимости), поэтому помощь в выяснении этого будет очень признательна. Спасибо!
ftell/fseekможет позволить коду обойти его и продолжить чтение. - person Igor Tandetnik   schedule 19.07.2013byteoffsetэтоlong. Я посмотрю значение, возвращаемое fscanf для каждой строки, но не будет ли строка всегда читать 8, если она возвращает 8 значений? Проблема не в отсутствии значения, а в двойном чтении значения. - person sdm142   schedule 22.07.2013