2010-12-05 4 views
0

ребята вы можете помочь мне с моим кодом .. я хочу, чтобы изменить конкретную строку в текстовом файле с помощью CI этот код ...Редактирование текстового файла в 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, шс

и это исходный файл:

12345, имя1, BSBA

12346, имя2, BSBA

12347, name3 , BSBA

12350, NAME4, BSBA

123 90, name5, bs

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

ответ

2

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

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

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

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

Хотя вы можете заставить свой подход работать для удаления записи указанного идентификатора студента, он очень негибкий. Поиск записи или добавление записи потребует полной перезаписи вашей программы. Если бы у вас был код, который мог бы считывать информацию в массив structinfo 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 
+0

это решение почти то же, что сказал нам наш учитель делать. :) Ты действительно потрясающий мистер. Павел. попробуйте сделать это один из них @ newbieatc. – newbie 2010-12-05 10:23:56

1

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

Смежные вопросы