如何在 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;
}
我已经对此进行了一段时间的研究,但未能找到对我的具体案例有帮助的任何内容。
我有一个函数需要加密文件中的文本。我想做的是从一个文本文件中读取一行并将其存储到一个字符串中,运行 对字符串进行加密算法并将字符串的加密内容写回到文件中。也就是说,我想用加密行替换文件的当前行。
这是我目前的情况:
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;
}