Как изменить переменную, которая находится внутри файла на C? - PullRequest
0 голосов
/ 29 октября 2019

Я новичок в кодировании, технически я начал в этом году программировать, и мне нужно много практиковаться. Как бы то ни было, я пытался изменить переменную, которая находится в файле, но браузер или процессор не нашли его. Когда я запускаю код, он может записать переменные, передать его в файл и прочитать его, но не может изменить переменную, которая находится внутри файла. Я пытался использовать некоторое время и если, но мои знания не могли зайти так далеко, как они.

Проблема в функции удаления, она может прочитать файл или архив, но не может достичь "конца файла"потому что, видимо, его не существует. Код в основном считывает удар числа и останавливается, когда вы вводите -1 на scanf. Он читает все числа (включая -1 дважды), а затем модифицирует последнее число, превращаясь в ноль. Проблема в том, что последняя функция повторяется бесконечно

#include<stdio.h>
void Create(FILE *p){
p=fopen("c:Example", "rb");
if(!p){
    p=fopen("c:Example", "wb");
    printf("El texto fue creado \n");
    } else {
    printf("El texto ya existe \n");
    }
}
void Add(FILE *p){
int a;
p=fopen("c:Example", "ab");
if(p==NULL){
    printf("El texto no se encontro \n");
    } else {
    scanf("%d", &a);
    while(a!=-1){
        fwrite(&a, sizeof(int), 1, p);
        scanf("%d", &a);
        }
    fwrite(&a, sizeof(int), 1, p);
    }
fclose(p);
}
void Read(FILE *p){
int a;
p=fopen("c:Example", "rb");
if(p==NULL){
    printf("El texto no existe \n");
    } else {
    fread(&a, sizeof(int), 1, p);
    printf("%d \n", a);
    while(a!=-1){
        fread(&a, sizeof(int), 1, p);
        printf("%d \n", a);
        }
    }
fclose(p);
}
void Delete(FILE *p){
int a;
p=fopen("c:Example", "wb");
if(p==NULL){
    printf("El texto no existe \n");
    } else {
    fread(&a, sizeof(int), 1, p);
    printf("(1)\n");
    while(a!=-1){
        fread(&a, sizeof(int), 1, p);
        printf("(2)\n");
        }
    a=0;
    printf("(3)\n");
    }
fclose(p);
}

int main(){
FILE *p;
Create(p);
printf("\n");
Add(p);
printf("\n");
Read(p);
printf("\n");
Delete(p);
printf("\n");
Read(p);
printf("\n");
return 0;
}

1 Ответ

0 голосов
/ 29 октября 2019

Решением проблемы может быть чтение чисел и создание нового файла с последним номером, который равен -1, заменяется на 0. Затем удалите старый файл и переименуйте временный файл как старый. Я написал решение, которое работает, стараясь не сильно менять ваш код. Я предлагаю вам лучше понять, как работают функции fread () и fwrite () . После функции scanf я использую функцию getchar () , чтобы удалить новую строку, вызванную нажатием Enter, из буфера. Попробуйте также сохранить ваш код в чистоте с пробелами и отступами.

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

void Create (FILE *p)
{

    if((p = fopen ("c:Example", "wb")) == NULL) // Check if file opening doesn't fail
    {
        printf ("Can't open file\n");
        exit (-1);
    }

    printf ("File exists\n");

    fclose (p); //Close file pointer
}

 void Add(FILE *p)
{
    int a = 0; // Initialize variable

    p = fopen("c:Example", "ab");

    if (p == NULL) // File opening failed
    {
        printf("El texto no se encontro \n");
        exit (-1); // Program has to terminate
    } 
    else 
    {

        while(a != -1)
        {
            printf ("Please insert number\n"); //Tell user what to do
            scanf ("%d", &a);
            getchar();
            fwrite(&a, sizeof(int), 1, p);
        }
    }

    fclose(p);
}

void Read(FILE *p)
{
    int a = 0; // Initialize variable
    p = fopen("c:Example", "rb");

    if(p == NULL) // Error opening file
    {
        printf("El texto no existe \n");
        exit (-1); // Program has to termimate
    } 
    else 
    {
        while(a != -1)
        {
                fread(&a, sizeof(int), 1, p);
                printf("I've read %d\n", a);
        }
    }

    fclose(p);
 }

 void Delete(FILE *p)
 {
     int a = 0;
     p = fopen("c:Example", "r"); //Open for read

     if(p == NULL) // Can't open file
     {
         printf("El texto no existe \n");
         exit (-1); //Exit the program
     } 

     else 
     {
        FILE *temp;
        if ((temp = fopen ("temp", "ab")) == NULL) //Create a temp file in append mode
         {
             printf ("Error creating temp file\n");
             fclose (p);
             exit (-1);
         }

         while (a != -1)
         {
             fread(&a, sizeof(int), 1, p);

             if (a != -1)
             {
                  fwrite (&a, sizeof(int), 1, temp); // write to temp only if is not -1
             }
         }

         a = 0;
         fwrite (&a, sizeof (int), 1, temp); //Write 0 to last position

         fclose (temp);
         fclose (p);
         remove ("c:Example"); //Remove old file
         rename ("temp", "c:Example"); //Rename new file
         }
  }

  void Read_new (FILE * p)
  {
     int a = -1 // Initialize a as -1;
     p = fopen ("c:Example", "rb");

     while (a != 0)
     {
          fread (&a, sizeof (int), 1, p);
          printf ("I've read %d\n", a);
     }

    fclose (p);
 }

 int main()
 {
    FILE *p;
    Create(p);
    Add(p);
    Read(p);
    Delete(p);
    Read_new(p);
    return 0;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...