2010-12-03 5 views
3

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

FIRST SAVE

test, test, test 
test, test, test 

ВТОРАЯ SAVE

test, test, test 

test, test, test 

ТРЕТИЙ SAVE

test, test, test 


test, test, test 

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

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); 
    }     
} 

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

+3

Что в 'массив [я] -> course'? Имеет ли она новую строку в конце? Что находится в 'array [i] -> studentID'? Имеет ли она новую линию в начале? –

+1

Очень возможно, что ваш 'array [i] -> course' имеет еще один терминатор новой строки. Подсказка: 'fgets()' читает всю строку вместе с терминатором новой строки. Как именно вы «сохраняете» файл? – ruslik

ответ

5

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

EDIT: это на самом деле правильно. OP использует функцию fgets, которая включает терминатор линии.

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

Вы можете это исправить, установив последний символ в нуль с

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

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

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

+0

Он уже признает это: «Проблема в том, что когда я закрываю файл и снова сохраняю файл, \ n становится \ n \ n и т. Д.». – DMan

+0

@DMan: И как вы думаете, что он это делает? – ruslik

+0

почему на самом деле? – Jack

3

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

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

к:

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

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

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

+0

Это не из-за модификаторов. – ruslik

+0

stream = fopen ("student.txt", "wb"); не помогает .. что делать? – newbie

3

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

+0

Как я могу убедиться, что он пропускает символы новой строки ??? есть ли функция для этого или мне нужно написать ее самостоятельно? – newbie

3

Здесь:

fgets(linebuffer, 45, stream); 

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

for (int i=strlen(linebuff)-1; i>=0 && linebuff[i]=='\n'; linebuff[i--]='\0'); 
Смежные вопросы