Изменить значение в определенной строке в файле C

#c #file

#c #файл

Вопрос:

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

 #include<stdio.h>

void main(){

    // creating a file pointer and a variable holding the file's name
    FILE* fp;
    char fileName[] = "list.txt";
    
    // array to store amount of cars left
    int carsLeft [10] ;

    // array to store the brand of each car
    char carModel[10][150];

    // array to store the price of each car
    int carPrice[10];
            
    // opening the file     
    fp = fopen(fileName, "r ");

           
    // making sure the file is not empty            
    if (fp != NULL) {
               
        // this loop will not stop until the if condition is met to break it
        while (1) {
                   
            // scanning for our data from the file                  
            int scanResult = fscanf(fp, "%s %d,%d", amp;carModel[i], amp;carPrice[i], amp;carsLeft[i]);              
            i  ;
                
            // if we reach the end of the file we end the loop            
            if (scanResult == EOF) {
              
                break;
            }
        }
  }
     scanf("%d", amp;usersChoice);

     // this is the modification I want to do in my txt file but I do not know how
     carsLeft [usersChoice - 1] -= 1;
}

  

Структура моего файла выглядит следующим образом:

 AAAA 12345,12
BBBB 56789,34
  

Моя цель — изменить 12 на 11.

Комментарии:

1. Ваш код модификации изменяет только carsLeft массив, который представляет собой данные, находящиеся в памяти, а не данные в файле. Чтобы изменить данные в файле, вы должны выполнить запись в файл (и найти соответствующую позицию в файле для записи). Но, честно говоря, я сомневаюсь, что вам действительно нужно вносить это индивидуальное изменение на месте.

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

3. Особенно спустя всего две недели будет сложно изменить одну часть текстового файла на месте. Как бы вы справились с повышением цены с 9999 до 10000? Где будет храниться дополнительная цифра? Самый простой способ — прочитать все данные, внести любые изменения и создать другой файл.

Ответ №1:

Я не знаю, как найти нужную мне конкретную строку, а затем установить указатель в правильное положение, чтобы изменить значение.

Рассмотрим случаи, когда цена равна 1000, а уменьшенное значение короче текста, сдвигая все оставшиеся записи.

Рассмотрим патологический случай, когда цена равна 0, а уменьшенное значение длиннее текста, сдвигая все оставшиеся записи.

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

     // Read data 
    while (i < 10 amp;amp; \ 
        fscanf(fp, "9s %d,%d", carModel[i], amp;carPrice[i], amp;carsLeft[i]) == 3) {
      i  ;
    }

    // edit data
    scanf("%d", amp;usersChoice);
    carsLeft[usersChoice - 1] -= 1;

    // Save
    rewind(fp);
    for (int j = 0; j < i); j  ) {
      fprintf(fp, "%s %d,%d", carModel[j], carPrice[j], carsLeft[j]);
    }

    // All done 
    fclose(fp);
  

Комментарии:

1. «Просто перепишите файл» часто является плохим советом.

2. @einpoklum Я с нетерпением жду вашей лучшей полной альтернативы для OP, который прокомментировал «Я программирую около 2 недель».