首页 > 解决方案 > 如何在 C 中逐行替换文件的文本?

问题描述

我已经对此进行了一段时间的研究,但找不到任何对我的具体案例有帮助的东西。

我有一个函数需要加密文件中的文本。我想要做的是从文本文件中读取一行并将其存储到一个字符串中,对字符串运行加密算法并将字符串的加密内容写回文件中。也就是说,我想用加密的行替换文件的当前行。

这是我到目前为止所拥有的:

int encrypt_file(char file_name[]) {
    FILE* file = fopen(file_name, "r+");

    if (file) {
        char line[300];
        while ((fgets(line, sizeof(line), file)) != NULL) {
            fseek(file, -(strlen(line)), SEEK_CUR);
            encrypt_string(line);
            if (fputs(line, file) == EOF) {
                printf("Error. Please try again.\n");
                fclose(file);
                return 1;
            }
        }
        fclose(file);
        return 0;
    } else {
        printf("Error. Ensure file exists and try again.\n");
        return 1;
    }
    fclose(file);
    return 0;
}

为了解释我的逻辑,我从文件中读取了该行,然后使用fseek将指针向后移动,无论读取了多少字符(它现在应该位于该行的开头)。然后我运行算法,然后将新字符串写回文件中。

但是,这段代码给了我一个无限循环。当我删除 时fseek,它不会给我一个无限循环,它告诉我该算法已在字符串上正确使用,但它显示了"Error. Please try again.\n"响应并且文件本身没有进行任何更改。

任何帮助表示赞赏。

标签: cfileread-write

解决方案


这里发布了一个答案,有助于解决我的问题。我不确定它为什么被删除,但如果有人想知道,建议我用它ftell来跟踪指针应该在哪里。这是我现在拥有的代码,它按预期工作(这些#ifdef语句只是为了找出问题所在,而不是代码工作所必需的):

int encrypt_file (char file_name[]) {
    FILE* file = fopen(file_name, "r+");
    long fileindex = 0;

    if (file) {
        char line[300];
        while ((fgets(line, sizeof(line), file)) != NULL) {
            #ifdef DEBUG
                printf("Input: %s", line);
                char* p = strchr(line, '\n');
                if (!p) {
                    printf("\n");
                }
            #endif

            fseek(file, fileindex, SEEK_SET);
            encrypt_string(line);

            #ifdef DEBUG
                printf("Output: %s\n", line);
            #endif

            if (fputs(line, file) == EOF) {
                printf("Error. Please try again.\n");
                fclose(file);
                return 1;
            }
            fileindex = ftell(file);
            fseek(file, 0, SEEK_CUR);
        }
        fclose(file);
        return 0;
    }
    else {
        printf("Error. Ensure file exists and try again.\n");
        return 1;
    }

    fclose(file);
    return 0;
}

推荐阅读