Удаление и переименование файлов с ошибкой C - PullRequest
0 голосов
/ 20 мая 2018

Итак, я пытаюсь обновить данные из исходного файла в новый временный файл, затем я удаляю исходный файл и переименовываю временный файл с именем исходного, например, так:

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

int main(){
 FILE * fptr = NULL;
 FILE * temp;

    fptr = fopen("Original.txt", "rw+");
    temp = fopen("temp.txt", "w");

    if(fptr==NULL)//Check if file was opened successfully
    {
        printf("File could not be opened");
    }


    //cicle of me adding data to temp file

    fclose(fptr);
    fclose(temp);

    remove("Original.txt");
    rename("temp.txt","Original.txt");

    return 0;
    }

itработает в первый раз, но когда я выполняю снова, Original.txt становится пустым.Что может быть причиной этого?

Я пытался изменить temp = fopen ("temp.txt", "w");to temp = fopen ("temp.txt", "ab +");но информация в файле Original.txt заканчивается без пробелов или новых строк между ними (все вместе).И то же самое с "wb"

"rb", файл Original.txt исчезает.

при необходимости я могу добавить весь код, хотя я не думаю, что он имеет значение

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Не уверен, что именно вы пытаетесь сделать, но в зависимости от вашего вопроса вам нужен только режим "r" для чтения.

, т. Е. fptr = fopen("Original.txt", "r");

Дополнительно, парапредложения, но не ответ на ваш вопрос:

  1. Вы проверяете fptr == NULL, но продолжаете писать данные?что если fptr == NULL имеет значение true, и вы пытаетесь прочитать из NULL-указателя?Помимо сообщения об ошибке, введите return -1 или что-то подобное, чтобы программа не продолжала работу в этом случае.

  2. Вам также следует проверить temp == NULL, чтобы определить, есть ли файлоткрыт для записи также.Что если temp == NULL имеет значение true и вы пытаетесь записать в нулевой указатель?

0 голосов
/ 20 мая 2018

В тот момент, когда вы делаете fopen (path, "w"), он усекает файл, указанный path.Затем вы закрываете файл.Поэтому, по сути, ваш «temp.txt» является пустым файлом после строки fclose (temp).Избавьтесь от «w +» и «w», так как они будут обрезать файл (сделать его нулевой длиной).

См. man fopen

w Обрезать файл до нулевой длины илисоздать текстовый файл для записи.Поток располагается в начале файла.

w + Открыть для чтения и записи.Файл создается, если он не существует, в противном случае он усекается.Поток располагается в начале файла.

Вам не нужно открывать или закрывать файл вообще.Если вы видите, что remove и rename абсолютно ничего не используют из предыдущей части кода.Также проверьте man rename и man remove.Если вы хотите знать, если файлы присутствуют или нет.Проверьте возвращаемые значения этих функций.В случае ошибки вы всегда можете проверить errno, чтобы понять, что именно пошло не так.(Подробности см. На странице руководства).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...