fprintf печатает новую строку в начале файла - PullRequest
2 голосов
/ 22 января 2012

Я использую функцию fprintf для печати в новый файл

Я использую следующую команду для записи несколько раз:

fprintf(fp, "%-25s %d %.2f %d",temp->data.name, temp->data.day, temp->data.temp, temp->data.speed);

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

typedef struct Data {
    char name[26];
    int day;
    int speed;
    float temp;
} Data ;

@ spatz Вы были правы, я новичок в строковом формате, и мне сказали сделать одиндля fscanf, где я должен был ожидать неопределенное количество пространства между битами данных, вот что я придумал, я почти уверен, что это источник проблемы:

check=fscanf(fp1, "%20c%*[^0-9]%d%*[^0-9]%f%*[^0-9]%d%*[^\n]%*c", name, &day, &temp, &speed);

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

Может кто-нибудь показать мне, как правильно написать эту вещь?

Ответы [ 2 ]

0 голосов
/ 23 января 2012

Ваша проблема в том, что name начинается с новой строки, и эта новая строка заканчивается в файле.

Чтобы правильно проанализировать файл, мне нужно знать его формат, но сейчас я предполагаю,это <string> <int> <int> <float> где число пробелов между каждым элементом может варьироваться.

Строка формата, с которой я бы начал, просто "%s%d%d%f", и пусть fscanf() обрабатывает пробелы.С помощью этой строки формата я смог правильно проанализировать такие строки, как

foo     3   4 7  

Если это не удовлетворяет вас, не стесняйтесь подробно разбирать формат файла, который вы анализируете, и я постараюсь найти решения.

0 голосов
/ 23 января 2012

Вместо того, чтобы вызывать fscanf () снова и снова и надеяться, что переводы строк совпадают с вашими желаниями, используйте fgets(), чтобы получить по одной строке за раз, анализируйте ее с помощью fscanf () и выполняйте обработку ошибок в строке по линии Это будет менее подвержено ошибкам, и похоже, что оно решит вашу проблему без лишних усилий.

...