У меня есть файл 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) +++