我已经对此进行了一段时间的研究,但找不到能够帮助我解决特定问题的任何东西。
我具有一个功能,需要对文件中的文本进行加密。我想要做的是从文本文件中读取一行并将其存储为字符串,对该字符串运行加密算法,然后将字符串的加密内容写回到该文件中。也就是说,我想用加密的行替换文件的当前行。
这是我到目前为止的内容:
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
捕获文件位置。唯一的其他事情可能是使用模式"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;
}