c - 如何在 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;
}
推荐阅读
- inno-setup - Inno Setup : 语言文件中的 Unicode 未按原样转换和显示
- java - Java HTTP library to request an OpenAPI token and issue Authorized requests
- javascript - Promise.all 返回承诺数组的承诺,但返回单个承诺的正确值
- linux - Shell脚本中的算术
- angular - Angular 单元测试表单验证
- android - 强制用户在第一次登录android时更改密码
- mocking - 空手道模拟 - 如何匹配请求正文内容
- java - 使用 OkHttpClient 连接到 API 导致 TLS 错误
- php - SQL查询后的TYPO3 CSV下载
- uipopovercontroller - UIModalPresentationPopover - 箭头方向向上,防止 Contentview 从箭头尖端开始