Строка переменной длины при удалении файла в C - PullRequest
0 голосов
/ 26 августа 2018

У меня есть файл main.txt, и я хочу удалить в этом файле строку, содержащую число, переданное программе в качестве аргумента.

Мой код:

FILE *temp = fopen("main.txt","r");
FILE *copy = fopen("temp.txt","w+");
char line[25]; //lines won't be more than this length
while(fgets(line, sizeof(line), temp)!=NULL)
{ 
     char *s;
     s = strstr(line, argv[2]));
     if(s!=NULL)
          continue;
     else
          fputs(line,copy);
}

fclose(temp);
fclose(copy);
remove("main.txt");
rename("temp.txt", "main.txt");

Случай, когда это не удается:

В настоящее время мой файл имеет:

echo hello 24224
echo test123 24196
echo bye 13279

Когда я пытаюсь удалить строку с 24196, она не копирует последнюю строку в новый файл. Использование ltrace показывает, что после того, как strstr возвращает ненулевое значение, fgets получает пустую строку. Как я могу это исправить, что здесь не так?

__libc_start_main(0x402636, 3, 0x7ffcee2a2078, 0x4036b0 <unfinished ...>
strcmp("unmanage", "unmanage")                   = 0
fopen("pid1.txt", "r")                           = 0x19ee010
fopen("temp.txt", "w+")                          = 0x19ee240
fgets("echo hello 30876\n", 25, 0x19ee010)       = 0x7ffcee2a1f60
strstr("echo hello 30876\n", "5785")             = nil
fputs("echo hello 30876\n", 0x19ee240)           = 1
fgets("echo lame 9047\n", 25, 0x19ee010)         = 0x7ffcee2a1f60
strstr("echo lame 9047\n", "5785")               = nil
fputs("echo lame 9047\n", 0x19ee240)             = 1
fgets("echo trial 5785\n", 25, 0x19ee010)        = 0x7ffcee2a1f60
strstr("echo trial 5785\n", "5785")              = "5785\n"
fgets("", 25, 0x19ee010)                         = 0x7ffcee2a1f60
strstr("", "5785")                               = nil
fputs("", 0x19ee240)                             = 1
fgets("", 25, 0x19ee010)                         = 0x7ffcee2a1f60
strstr("", "5785")                               = nil
fputs("", 0x19ee240)                             = 1
fgets("", 25, 0x19ee010)                         = 0x7ffcee2a1f60
strstr("", "5785")                               = nil
fputs("", 0x19ee240)                             = 1
fgets("", 25, 0x19ee010)                         = 0x7ffcee2a1f60
strstr("", "5785")                               = nil
fputs("", 0x19ee240)                             = 1
fgets("", 25, 0x19ee010)                         = 0
fclose(0x19ee010)                                = 0
fclose(0x19ee240)                                = 0
remove("pid1.txt")                               = 0
rename("temp.txt", "pid1.txt")                   = 0
atoi(0x7ffcee2a320f, 0x403aca, 0, 0x7fde8ca22367) = 5785
kill(5785, SIGTERM)                              = 0
 +++ exited (status 0) +++
...