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

问题描述 投票:0回答:1

我已经对此进行了一段时间的研究,但找不到能够帮助我解决特定问题的任何东西。

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

这是我到目前为止的内容:

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"响应,并且未对文件本身进行任何更改。

感谢您的任何帮助。

c file read-write
1个回答
0
投票

尝试使用ftell捕获文件位置。唯一的其他事情可能是使用模式"rb+"

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) {
            fseek(file, fileindex, SEEK_SET);
            encrypt_string(line);
            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;
}
© www.soinside.com 2019 - 2024. All rights reserved.