#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 недель».