Считать номер из файла и заменить его другим номером - PullRequest
1 голос
/ 24 сентября 2011
12 23 34 45 56
34 23 56 21 43
12 57 98 34 12

Выше приведено содержимое текстового файла.

С C я могу использовать fgetc(myFile), чтобы получить первое целое число и сохранить его в целочисленной переменной.

Iпроверим, равно ли оно 12.

, если это 12, я хочу заменить на 25. Как мне точно заменить это определенное число.

Как мне переписать определенную его часть?

Или я храню каждое число в массиве, заменяю все 12 на другие числа и перезаписываю весь файл ??

Ответы [ 3 ]

1 голос
/ 24 сентября 2011

Если это небольшой файл, перезаписать весь файл будет хорошей идеей и проще.

Если он не ограничен в языке c, вы можете попробовать мощные инструменты, такие как "sed" или некоторый язык сценариев.

0 голосов
/ 25 сентября 2011

Сохранить результат в другой файл, чем переименовать его.Этот код открывает homework.txt, заменяет все 12 -> 25 и записывает результат в 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;
}
0 голосов
/ 24 сентября 2011

Вот список:

fgets
ftell
fseek
fputs

Обратите внимание, что вам необходимо обеспечить правильную длину записанных данных, чтобы перезаписать именно то, что вы хотите.

Другой вариант, как вы сказали, перезаписать весь файл, тогда вам также нужно

freopen
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...