Я делаю текстовый редактор в терминале, одна из его функций - редактировать определенную строку. Для этого
Я создаю новый временный текстовый файл, удаление старого/исходного и переименовать временный в исходный.
Вот код:
FileLineEdit(char filename[20], int line, char newline[1000]){
FILE * fp;
FILE * fptmp;
char buffer[1000];
int count;
int ret;
fp = fopen(filename, "r");
fptmp = fopen("tmp/replace.txt", "w");
if (fp == NULL || fptmp == NULL)
{
printf("\nErro!\n");
exit(1);
}
count = 0;
while ((fgets(buffer, 1000, fp)) != NULL)
{
count++;
if (count == line)
fputs(newline, fptmp);
else
fputs(buffer, fptmp);
}
fclose(fp);
fclose(fptmp);
//strcat(fullpath, filename);
//printf("%s", fullpath);
ret = remove(filename);
if (ret == 0) {
printf("File deleted successfully");
} else {
printf("Error: unable to delete the file");
}
rename("tmp/replace.txt", "tmp/a.txt");
getch();
}
Вывод постоянно:
Error: unable to delete the file
Кстати, как только я попробую это вне папки «tmp/», он отлично работает
🤔 А знаете ли вы, что...
C стандартизирован ISO и ANSI, что обеспечивает переносимость кода между различными компиляторами и платформами.
В папке /tmp
установлен липкий бит (s
), а это значит, что любой может читать и создавать/изменять файлы в ней, но только ее владелец (root) может их удалить.
Итак, если вы хотите, чтобы ваша программа делала это, вы должны делать это в каком-либо каталоге, отличном от /tmp
Кроме того, как указал jarmod, у вас не должно быть жестко закодированного имени файла для вашего временного имени файла. Вы должны использовать tmpfile или тмпнам для этой цели: Вместо:
fptmp = fopen("tmp/replace.txt", "w");
Написать:
fptmp = tmpfile();
Файл будет автоматически удален при закрытии файлового потока.
(Вы можете прочитать больше о /tmp
директоре здесь)