Вы читаете с
fscanf(stream, "%[^\t]\t%[^\t]", sku, fnsku);
После прочтения первой строки, которая должна заканчиваться символом табуляции (как в "%[^\t]\t%[^\t]"
).Входной буфер имеет последний символ табуляции '\ t', который не читается приведенным выше вызовом функции.Таким образом, в следующей итерации он будет прочитан в начале с вашей строкой формата.Но fcanf
в следующей итерации сразу же возвращается, так как он встретил символ табуляции '\ t' в самом начале ("%[^\t]"
), поэтому буферы все еще имеют значение последнего считанного значения.Отныне каждая итерация пытается прочитать файл с fscanf
, но терпит неудачу каждый раз, когда сталкивается с '\t'
в самом начале.Таким образом, вы не продолжаете чтение файла, и первые значения чтения из ваших программных буферов показываются и включаются.
Вам необходимо прочитать последний символ, который завершил сопоставление набора сканирования.Вы можете либо использовать fgetc (stream)
после вызова fscanf ()
, либо использовать следующую строку формата: "%[^\t]\t%[^\t]%*c"
.%*c
- это синтаксис подавления присваивания.Это сделает один символ прочитанным из входного файла, но затем отбросит его.
Также вы должны проверить, что возвращает fscanf ()
.Если он не возвращает 2 (количество элементов для чтения), то есть проблема, которую вы должны решить.Таким образом, вы можете убедиться, что правильное количество элементов было прочитано за один вызов.
Так что вы можете сделать:
while (!feof (stream))
{
fscanf(stream, "%[^\t]\t%[^\t]", sku, fnsku);
fgetc (stream);
printf("%s\t%s\n", sku, fnsku);
fprintf(output, "%s\t%s\t%\t%s\t%s\t%i\n", sku, fnsku, asin, quality);
}
Или вы можете сделать:
while (!feof (stream))
{
fscanf(stream, "%[^\t]\t%[^\t]%*c", sku, fnsku);
printf("%s\t%s\n", sku, fnsku);
fprintf(output, "%s\t%s\t%\t%s\t%s\t%i\n", sku, fnsku, asin, quality);
}
Но я рекомендую прочитать его с помощью fgets ()
, а затем проанализировать его внутри вашей программы с помощью strtok ()
или другими способами и способами.
EDIT1:
Примечаниечто если исходный файл заканчивается на '\n'
, то после прочтения строк, как указано выше, в ваши буферы будет добавлен дополнительный символ новой строки.Если вы по-прежнему рассматриваете возможность непосредственного чтения полей с fscanf ()
, где каждая строка имеет несколько полей, разделенных с '\t'
, а запись заканчивается '\n'
, тогда вам следует использовать следующую строку формата: "%[^\t]\t%[^\t]\n"
.
Трудно ответить, пока мы не получаем точный формат файла.Содержит ли файл только одну строку с полями, разделенными вкладками?Или есть несколько строк, каждая строка имеет разделенные табуляцией поля.Если последнее верно, лучше всего отсканировать всю строку сразу, а затем выполнить внутренний анализ.