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