如何在 C 中替换文件的逐行文本?

How do I replace line-by-line text of a file in 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" 响应并且没有进行任何更改到文件本身。

感谢任何帮助。

这里发布了一个答案,帮助解决了我的问题。我不确定为什么它被删除了,但如果有人想知道,有人建议我使用 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;
}