william
william

Reputation: 7694

Read number from a file and replace it with another number

12 23 34 45 56
34 23 56 21 43
12 57 98 34 12

The above is the content of a txt file.

With C, i can use fgetc(myFile) to get the first integer and store into an integer variable.

I will check whether it is 12.

if it is 12, i want to replace with 25. How do i exactly replace it a certain number.

How do i rewrite a certain part of it?

Or do i store every number into an array, replace all 12s with another numbers and overwrite the whole file??

Upvotes: 1

Views: 2626

Answers (3)

Alex Voikov
Alex Voikov

Reputation: 121

Save result to another file, than renames it. This code opens homework.txt, replaces all 12 -> 25 and writes result to homework_new.txt

#include <stdio.h>
#include <string.h>

#define MAXBUF 42
#define HOMEWORKFILE "homework.txt"
#define HOMEWORKNEWFILE "homework_new.txt"

int main(int argc, char **argv)
{
    char buf[MAXBUF+1];
    char str[MAXBUF+1];
    FILE *hw;
    FILE *hw_new;
    int length;
    int i, j;
    int number;
    char is_first;
    int n_line = 0;

    hw = fopen(HOMEWORKFILE, "r");
    hw_new = fopen(HOMEWORKNEWFILE, "w");

    if (!hw)
    {
        fprintf(stderr, "File not found: %s\n", HOMEWORKFILE);
        return 5;
    }

    while(!feof(hw))
        if (fgets(buf, MAXBUF, hw) != NULL)
        {
            length = strlen(buf);
            j = 0;
            str[0] = 0;
            is_first = 1;
            n_line++;
            /* parse string */
            for(i = 0; i < strlen(buf); ++i)
            {
                if (isblank(buf[i]) || buf[i] == '\0' || buf[i] == '\n')
                {
                    str[j] = 0;
                    number = atoi(str);

                    if (is_first)
                        is_first = 0;
                    else
                        fprintf(hw_new, " ");

                    if (number == 12)
                        fprintf(hw_new, "%d", 25);
                    else
                        fprintf(hw_new, "%d", number);

                    j = 0;
                }
                else if (isdigit(buf[i]))
                {
                    str[j++] = buf[i];
                }
                else
                {
                    fprintf(stderr, "bad input on line %d '%s'\n", n_line, buf);
                    return 100;
                }
            }
            fprintf(hw_new, "\n");

        }

    fclose(hw_new);
    fclose(hw);
    return 0;
}

Upvotes: 1

Colin
Colin

Reputation: 11

If it's a small file , to overwrite the whole file is a good idea and easier.

If it's not limited in c language, you can try powerful tools like "sed" or some script language.

Upvotes: 1

littleadv
littleadv

Reputation: 20282

Here's a list:

fgets
ftell
fseek
fputs

Note that you need to ensure the correct lengths of the data written, in order to overwrite exactly what you want.

Another option would be, as you said, to overwrite the whole file, then you also need

freopen

Upvotes: 0

Related Questions