Редактирование текстового файла в c

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

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


struct studentinfo{

       char id[8];
       char name[30];
       char course[5];
}s1;

int main(void){

     FILE *stream = NULL;
     FILE *stream2 = NULL;
     stream = fopen("studentinfo.txt", "rt");
     stream2 = fopen("studentinfo2.txt", "w+");

     char arr [100];
     char arr2[100];
     char arr3[100];
     int i=0;
     int count=0;

     printf("enter details: ");
     gets(arr2);
     printf("enter new student id: ");
     gets(arr3);

    while(!feof(stream)){ 
     fgets(arr, 6, stream);
        if(strcmp(arr, arr2)!=0){
        fprintf(stream2, "%s", arr);
        }else printf("student id found!");
    }
     fclose(stream);
     fclose(stream2);
     getch();
}

Программа успешно удаляет идентификатор студента w/c, который был введен пользователем, если он соответствует данным в текстовом файле.

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

эта программа копирует только данные, которые не эквивалентны пользовательскому вводу, и сохраняет их в другом текстовом файле (у меня есть 2 текстовых файла), это результат, если пользователь ввел 12345

способ хранения данных в другом файле:

name1, bsba

12346, name2, bsba

12347, name3, bsba

12350, name4, bsba

12390, name5, bs

И ЭТО ОРИГИНАЛЬНЫЙ ФАЙЛ:

12345, name1, bsba

12346, name2, bsba

12347, name3, bsba

12350, name4, bsba

12390, name5, bs

любые лучшие решения? благодаря:) в любом случае еще раз спасибо aix, coz i'v получил эту идею от него... к сожалению, я не могу закончить это... надеюсь, что вы можете мне помочь...

Ответ 1

Вы читаете только 5 символов за раз. Хотя это будет работать (потому что fgets остановится в конце строки), это очень неэффективно и означает, что вы сравниваете входные данные пользователей с каждыми 6 символами файла, даже если это содержимое файла не является идентификатором студента.

Если вы хотите продолжить подход к вашей программе, когда вы получите совпадение с пользовательским вводом, вам нужно прочитать (и отбросить) остальную часть строки, прежде чем продолжить изучение дальнейших строк.

Для строк, которые не совпадают, вы должны прочитать (и скопировать в новый файл) оставшуюся часть строки, не сравнивая ее с пользовательским вводом (поскольку вы знаете, что это не идентификатор студента).

Я подозреваю, что человек, который написал задание, ожидал, что вы прочитаете всю строку, разделите ее (путем поиска запятых) в различные поля и поместите информацию в свои студийные структуры. Затем обработайте studentinfo любым способом, на который запрошено задание, и, наконец, напишите новый файл с измененными данными.

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

Итак, в псевдокоде вам нужно что-то вроде этого

allocate space for one line of the file
allocate space for an array of struct studentinfos

readinfo function:

open the student info file for reading
set the count of student records to 0
while not at eof
    read in a line
    split the line on commas
        copy the bit before the first comma to the 'id' field of the newly allocated studentinfo record 
        copy the bit between first and second commas to the name field
        copy the bit from the second comma to the course field
    add one to the count of student records
go back to read another line
close the file

writeinfo function:
open the studentinfo file for writing
loop over the studentinfo structs in order
    writeout the id, name and course strings of the current record, separated by comma and followed by new line
close the file
deletestudent function:
read a course id from the user (or read it in your main program and pass it here as a parameter)
loop over the studentinfo array
    compare the id to the one of the current record
    if a match
        shift all records after this down one by copying them over the top of the record before
       subtract one from the number of student records (since we've deleted one)
       return from the function indicating found and delete
repeat for next record
if you complete looking at all records,
    return from the function indicating no match found

Ответ 2

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