如何在 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: %sn", 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;
}

最新更新