Editing a text file in c
guys can you help me with my code.. i want to edit a specific line in a text file using c i have this code...
#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();
}
The program successfully deletes the student id w/c was inputed by the user if it matches to the data in the text file.
but i still don't know how to replace the student id or any fields related with it.
this program only copies data which is not equivalent to the user's input and store it to another text file(i have 2 text files) this is the output if the user entered 12345
the way it stores data to the other file:
, name1, bsba
12346, name2, bsba
12347, name3, bsba
12350, name4, bsba
12390, name5, bs
AND THIS IS THE ORIGINAL FILE:
12345, name1, bsba
12346, name2, bsba
12347, name3, bsba
12350, name4, bsba
12390, name5, bs
any better solutions? thanks :) anyway thanks again to aix, coz i'v got this idea from him... unfortunately i cant finish it... hope you can help me...
You are reading only 5 characters at a a time. While this will work (because fgets will stop at the end of a line), it's very inefficient and means you are comparing the users input to every 6 characters of a file, even when those file contents are not the student id.
If you do want to continue with the approach of your program, when you do get a match with the user input, you need to read (and discard) the rest of the line before continuing examining further lines.
For lines that don't match, you should read (and copy into the new file) the remainder of the line without comparing it to the user input (since you know it is not the student id).
I suspect the person who wrote the assignment expected you to read an entire line in, split it (by looking for the commas) into the various fields and put the information into your studentinfo structures. Then process the studentinfo in whatever way the assignment requested, and finally write the new file with the modified data.
Although you can make your approach work for deleting a record of a specified student id, it is very inflexible. Searching for a record, or adding a record would require a complete rewrite of your program. If you had code that could read the information into an array of studentinfo structs, and write that info out again, any processing you needed to do would just work on those structs and the changes would be much smaller.
So, in pseudo code, you want something like this
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
You can't directly edit a text file. Whenever, you need to change a particular content, you have to first change that in memory and later write back everything.
精彩评论