Редактирование текстового файла в c - PullRequest
0 голосов
/ 05 декабря 2010

ребята, вы можете помочь мне с моим кодом ... я хочу редактировать определенную строку в текстовом файле, используя 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();
}

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

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

эта программа только копирует данные, которые не эквивалентны вводу пользователя, и сохраняет их в другом текстовом файле (у меня есть 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

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

Ответы [ 2 ]

2 голосов
/ 05 декабря 2010

Вы читаете только 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
1 голос
/ 05 декабря 2010

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

...