Я пытаюсь создать простую программу для вставки текста в определенную позицию в существующем текстовом файле. Например, если в файле text.txt находится текст «образец текста», после запуска программы в файле text.txt должен быть текст «вставка текста в текст». Но иногда программа вставляет какие-то странные символы в конец текста, поэтому в этом случае я получил "saminserting textple textX €" (где почему-то стоит "X €" в конце текста), и я не могу понять, почему . Мой код:

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


int main ( int argc, char *argv[] )
{

FILE *file;

 file = fopen("text.txt", "rb+"); //processed file
 if (file == NULL) return 0;

 char *test = "inserting text"; //text for inserting
 char *buffer;
 int size;

 fseek(file, 0L, SEEK_END);
 size = ftell(file);

 fseek(file, 3L, SEEK_SET);
 buffer = malloc(abs(3L - size) + 1);
 fread(buffer, abs(3L - size), 1, file);

 fseek(file, 3L, SEEK_SET);
 fwrite(test, strlen(test), 1, file);
 fwrite(buffer, strlen(buffer), 1, file);

 free(buffer);
 fclose(file);

 return 0;
}

Буду благодарен за любую помощь.

0
Petr Šrámek 7 Мар 2014 в 02:33
Почему не size -3, а abs(3L - size)?
 – 
Roddy
7 Мар 2014 в 02:37
buffer обнуляется?
 – 
BLUEPIXY
7 Мар 2014 в 02:39
@BLUEPIXY, ну, только если файл содержит строку с завершающим нулем. что маловероятно.
 – 
Roddy
7 Мар 2014 в 02:42
Я говорю о buffer, а не о файле. Также файл является текстовым файлом.
 – 
BLUEPIXY
7 Мар 2014 в 02:45
@BLUEPIXY. Точно: в буфер никогда не записывается нуль. Просто заливается из файла. (и хотя это очень маловероятно, текстовый файл может содержать нули ...)
 – 
Roddy
7 Мар 2014 в 02:47

1 ответ

Лучший ответ
buffer = malloc(abs(3L - size) + 1);
fread(buffer, abs(3L - size), 1, file);
...
fwrite(buffer, strlen(buffer), 1, file);

Вы никогда не завершаете buffer нулевым символом, поэтому потенциально вы пишете не то, что читаете. Сделайте это вместо этого. (Но на самом деле используйте size-3 или что-нибудь получше ...)

fwrite(buffer, abs(3L - size), 1, file);
1
Roddy 7 Мар 2014 в 02:41