45871

Editing a text file in c

Question:

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...

Answer1:

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

Answer2:

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.

Recommend

  • Does detach in JQuery destroys the node in DOM?
  • When to use volatile with register/local variables
  • How to declare and use the name of a function from a json object?
  • Map collection separate Object values
  • Is it possible to have different behavior for first and second input files to awk?
  • How define differents stores for each cell combobox editor in a grid?
  • How to sort a DateTime-column in DataView?
  • How to get data from URL using Windows and C?
  • memcache won't store key/value because the value is too big
  • Angular 2 + Jasmine Unit Test - Getting Error TS2345
  • IntelliJ - debug mode - search text in program memory
  • Type mismatch: cannot convert from Connection to Connection
  • Drag and Drop for imageview not working
  • Storing data from SQL in array
  • Can I use jquery to blank textarea fields or ajax like input boxes?
  • Converter from SAT to 3-SAT
  • Excel VBA How to populate a multi-dimensional (3d) array with values from multiple excel ranges?
  • Examples of how to a STS in .Net 4.5 using WCF
  • How do I remove all but some records based on a threshold?
  • android google indoor map
  • MonoTouch: How to download pdf incrementally as indicated in the Apple slides “Building Newsstand Ap
  • Is there a perl module to validate passwords stored in “{crypt}hashedpassword” “{ssha}hashedpassword
  • How do I change content of ComboFieldEditor?
  • Java Scanner input dilemma. Automatically inputs without allowing user to type
  • Deserializing XML into class C#
  • what is the difference between the asp.net mvc application and asp.net web application
  • Weird JavaScript statement, what does it mean?
  • Do I've to free mysql result after storing it?
  • Function pointer “assignment from incompatible pointer type” only when using vararg ellipsis
  • jqPlot EnhancedLegendRenderer plugin does not toggle series for Pie charts
  • How do I rollback to a specific git commit
  • Is there a mandatory requirement to switch app.yaml?
  • bootstrap to use multiple ng-app
  • Matrix multiplication with MKL
  • SQL merge duplicate rows and join values that are different
  • How to CLICK on IE download dialog box i.e.(Open, Save, Save As…)
  • python draw pie shapes with colour filled
  • Busy indicator not showing up in wpf window [duplicate]
  • Binding checkboxes to object values in AngularJs
  • How to Embed XSL into XML