2015-09-25 2 views
2

В следующем коде я ищу '.' в моем шаблоне для вставки строки после нее. По какой-то причине, хотя строка вставляется как ожидалось, она удаляет текст из моего шаблона. У меня нет идеи, где проблема может быть. Пробовал fflush() без хорошего эффекта.
Режим чтения файла «r +» неожиданное поведение в C

#include <stdio.h> 
#include <string.h> 

int main() { 
    FILE * fp; 
    int tmp_char, tmp_offset; 
    char file_name[50] = "FileIoTest_template.txt"; 
    char tmp_string1[50] = "Generic String 1"; 
    char tmp_string2[50] = "Generic String 2"; 
    long tmp_long; 

    fp = fopen(file_name, "r+"); 
    //fseek(fp, 0, SEEK_SET); 

    do { 
     tmp_char = fgetc(fp); 
     printf("%c ", tmp_char); 
     if (tmp_char == '.') 
      break; 
    } while (tmp_char != EOF); 
    tmp_long = ftell(fp); 
    fseek(fp, tmp_long, SEEK_SET); 
    tmp_offset = strlen(tmp_string1); 
    fputs(tmp_string1, fp); 
    fputs("\n", fp); 
    //fflush(fp); 

    fseek(fp, tmp_long+tmp_offset, SEEK_SET); 
    do { 
     tmp_char = fgetc(fp); 
     printf("%c ", tmp_char); 
     if (tmp_char == '.') 
      break; 
    } while (tmp_char != EOF); 
    tmp_long = ftell(fp); 
    fseek(fp, tmp_long, SEEK_SET); 
    fputs(tmp_string2, fp); 
    fputs("\n", fp); 
    //fflush(fp); 

    fclose(fp); 
    return 0; 
} 

Вот мой шаблон, "FileIoTest_template.txt":

Sample list: 
1. 
2. 
3. 
random text 

4. 
5. 
6. 

bunch of random text 

Выход моего кода:

Sample list: 
1.Generic String 1 
ext 

4.Generic String 2 
of random text 
+3

Это как если бы вы считали файл 'fputs' _inserts_ в файле. Это не так; он просто перезаписывает все, что есть на данный момент (на текущей позиции). – davmac

+0

Он не «удаляет», он просто перезаписывает ваши существующие данные новым. Если вы хотите вставить, вам нужно сделать это самостоятельно. – Matt

+0

Возможно, у Ii есть перезаписанные данные. Поскольку вы используете режим «r +», чтобы он не удалял уже имеющиеся данные. Посмотрите, правильно ли вы позиционируете курсор. – ameyCU

ответ

2

Вы не можете легко изменить файл, вставляя данные в середину, не заменяя ничего, что уже есть. Вам нужно будет перезаписать весь файл, начиная с точки вставки до конца (минуя оригинал конец в любую точку, в которой должен быть новый конец). Трудно сделать это правильно, и небезопасно пытаться, поскольку если процесс прерывается посередине, тогда ваш файл оборван.

Обычно вместо этого создается новая версия содержимого файла во временном файле, и как только это будет успешно завершено, один заменит исходный файл на новый.

+0

Спасибо. Моя ошибка заключалась в том, чтобы предположить, что операции записи файлов вставляют текст, который в ретроспективе кажется глупым. –

Смежные вопросы