C Программирование FprintF проблема - PullRequest
3 голосов
/ 03 декабря 2010

У меня проблема при записи файла в текст.Как вы могли видеть, я использовал \n, чтобы поместить другой набор моих данных в следующую строку.Проблема в том, что когда я закрываю файл и снова сохраняю данные в каждой строке, которая заканчивается на \n, становится \n\n и так далее.Вот почему мой файл выглядит такотобразить его на экране ... между ними есть значение мусора ... Мой код выглядит следующим образом:

save(){
     int i = 0;
     FILE *stream = NULL;
     stream = fopen("student.txt", "wt");
     printf("\nSaving the student list directory. Wait a moment please...");
     printf("\nExiting the program...");
     for (i=0; i<recordCtr; i++){
        fprintf(stream, "%s, %s, %s\n", array[i]->studentID, array[i]->name, array[i]->course);  
     }                   
}

Помогите, пожалуйста ... любые предложения будут оценены.Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

Не уверен, что именно вы делаете, но если вы проанализируете файл перед сохранением, возможно, вы забудете удалить старый \n из исходной последней строки.

РЕДАКТИРОВАТЬ: это на самом делеправо.OP использует fgets функцию, которая включает в себя терминатор строки.

Таким образом, начиная с «test, test, test \ n» с strtok, он получит «test», «test», «test \ n»так что когда он будет сохранен обратно, в файл будет добавлен новый символ новой строки (забудьте об этом).

Вы можете исправить это, установив для последнего символа значение null с помощью

linebuffer[strlen(linebuffer)-2] = '\0'

(этобезопасно, так как fgets возвращает строку с нулевым символом в конце)

Вы также можете добавить \n к используемым разделителям, в конечном итоге вы должны иметь такое же поведение (не уверен насчет пустых токенов со strtok, но IIRC они просто отбрасываются).

3 голосов
/ 03 декабря 2010

Здесь:

fgets(linebuffer, 45, stream);

удалить конечный \n из linebuffer, если он есть:

for (int i=strlen(linebuff)-1; i>=0 && linebuff[i]=='\n'; linebuff[i--]='\0');
3 голосов
/ 03 декабря 2010

Я предполагаю, что ваше поле array[i]->course содержит \ n, записанный ранее при последнем сохранении. Проверьте код, который заполняет массив, и убедитесь, что он пропускает символы новой строки.

3 голосов
/ 03 декабря 2010

Я предполагаю, что это на окнах - измените свою строку:

stream = fopen("student.txt", "wt");

до:

stream = fopen("student.txt", "wb");

И вы не получите больше \r с.

В качестве альтернативы, возможно, последняя строка, которую вы fprintf используете, уже имеет в конце символ новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...