简体   繁体   中英

replace a substring in a string in C, windows

I want to do the following:

  • open and read and ASCII file

  • locate a substring (geographical coordinates)

  • create its replacement (apply corrections to the original coordinates)
  • overwrite the original substring (write in the original file the corrected coordinates).

The format of the ASCII file is: $GPGGA,091306.00, 4548.17420 ,N, 00905.47990 ,E,1,09,0.87, 233.5 ,M,47.2,M,,*53

I will paste here only the part of the code that is responsible for this operation:

opnmea = fopen (argv[1], "r+");
if (fgets(row_nmea, ROW, opnmea)==NULL){             
   if (strstr(row_nmea,"$GPGGA")!=NULL) {
       sscanf(row_nmea+17, "%10c", old_phi);
       sscanf(row_nmea+30, "%11c", old_lam);
       sscanf(row_nmea+54, "%5c", old_h);
       fputs();
   }
}

What I do till now is to extract in a variable the old coordinates and I was thinking to use fputs() for overwriting the old with new values. But I could not do it. The other part of the code that is not here is computing the correct coordinates. My idea is to correct the rows one by one, as the fgets() function reads each line.

I would appreciate very much any suggestion that can show me how to use fputs() or another function to complete my work. I am looking for something simple as I am beginner with C.

Thank you in advance.

Patching a text file in place is not a good solution for this problem, for multiple reasons:

  • the modified version might have a different length, hence patching cannot be done in place.

  • the read-write operation of standard streams is not so easy to handle correctly and defeats the buffering mechanism.

  • if you encounter an error during the patching phase, a partially modified file can be considered corrupted as one cannot tell which coordinates have been modified and which have not.

  • other programs might be reading from the same file as you are writing it. They will read invalid or inconsistent data.

I strongly recommend to write a program that reads the original file and writes a modified version to a different output file.

For this you need to:

  • open the original file for reading opnmea = fopen(argv[1], "r");

  • open the output file for writing: outfile = fopen(temporary_file_name, "w");

  • copy the lines that do not require modification: just call fputs(row_nmea, outfile) .

  • parse relevant data in lines that require modification with whatever method you are comfortable with: sscanf , strtok , ...

  • compute the modified fields and write the modified line to outfile with fprintf .

Once the file has been completely and correctly handled, you can replace the original file with rename . The rename operation is usually atomic at the file-system level, so other programs will either finish reading from the previous version or open the new version.

Of course, if the file has only one line, you could simply rewind the stream and write back the line with fprintf , but this is a special case and it will fail if the new version is shorter than the original. Truncating the extra data is not easy. An alternative is to reopen the file in write mode ( "w" ) before writing the modified line.

I would recommend strtok() , followed by your revision, followed by strcat() .

strtok() will let you separate the line using the comma as a delimiter, so you will get the field you want reliably. You can break up the line into separate strings, revise the coordinates you wish, and reassemble the line, including the commas, with strcat() .

These pages include nice usage examples, too:

http://www.cplusplus.com/reference/cstring/strtok/ http://www.cplusplus.com/reference/cstring/strcat/?kw=strcat

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM