我正在用C语言编写一个简单的XOR加密程序。
应该逐行读取文本文件 并创建一个新的加密文件。
问题是它只加密文件中的第一行,跳过文件的其余部分。
这是我提出的代码。 根据我的分析,它应该逐行加密文件。 但显然我在某处错了,这就是为什么它行为不端。
如果有人能够指出我的错误,那将是非常有帮助的。
#include <stdio.h>
void encrypt(char *msg);
int main()
{
char line[100]; //all lines in file are shorter than 100 characters
FILE *in=fopen("msg.txt","r");
FILE *out=fopen("encrypted_msg.txt","a");
while(fscanf(in,"%99[^\n]",line)==1) // I included scanset to read new line in every iteration
{
encrypt(line);
}
fprintf(out,"%s\n",line);
return 0;
}
void encrypt(char *msg)
{
while(*msg)
{
*msg=*msg^31;
msg++;
}
}
答案 0 :(得分:2)
这很简单。只需添加:
char c = fgetc(in);
在while
内阅读结束日\n
。
像这样:
while(fscanf(in,"%99[^\n]",line)==1)
{
encrypt(line);
char c = fgetc(in);
}
您指定fscanf
来读取换行符\n
以外的所有符号,因此在第一次while
次迭代后,输入中有一个\n
,第二个while
迭代fscanf
无法读取任何内容,因为您从允许的字符集中排除\n
。
答案 1 :(得分:0)
我认为Edgar Rokyan的答案是有效的,因为fscanf不会删除行中的\ n,因此下次第一个字符串出现时会出现\ n,因此无法读取任何内容。我的解决方案是使用fgets而不是将\ n读入行缓冲区(如果你不想要它,只需用if语句检查它并将最后一个char更改为\ 0)。
while(fgets(line, 99, in)) // I included scanset to read new line in every iteration
{
encrypt(line);
}
或者摆脱行尾的\ n。
while(fgets(line, 99, in)) // I included scanset to read new line in every iteration
{
int len = strlen(line);
if(line[len - 1] == '\n')
line[len - 1] = '\0';
encrypt(line);
}