两次成功读取后,与 fseek() 一起使用时,fgetc() 不起作用
After two successful read fgetc() is not working when used with fseek()
我正在尝试加密(简单的位操作算法)一个文件,为此我创建了三个不同的版本
- 在加密或解密过程中创建新文件并删除旧文件并重命名
- 加密或解密发生在同一个文件上,使用两个不同的
File *
,一个在 rb
中打开文件,另一个在 rb+
中打开同一个文件。
- 加密或解密发生在同一个文件上,只使用一个
FILE*
,文件以rb+
模式打开。
前两个版本按预期工作,它们不使用 fseek(),但我在版本 3 中遇到问题
v3 代码:
FILE *inputFile= NULL,*outputFile = NULL;
char *inName = "file.txt",*outName;
/* I am using same source file for all three version controlled by #if, so the following assignment is necessary*/
outName = inName;
inputFile = fopen(inName,"rb+");
if(inputFile == NULL)
{
perror(inName);
exit(EXIT_FAILURE);
}
/* I am using same source file for all three version controlled by #if, so the following assignment is necessary*/
outputFile = inputFile;
long int currentLocation;
unsigned char targetChar;
int intChar;
long int offset,temp;
while(currentLocation = ftell(inputFile),(intChar = fgetc(inputFile))!= EOF)
{
targetChar = intChar;
/*#if encryption
encrypt(&targetChar);
#else
decrypt(&targetChar);
#endif // encryption*/
/* going back in the file to the starting position of currently read character*/
temp = currentLocation;
currentLocation = ftell(inputFile);
offset = temp - currentLocation; // the offset is always -1 throughout the program(gdb)
if(fseek(inputFile,offset,SEEK_CUR)==-1)
{
perror(outName);
exit(EXIT_FAILURE);
}
// writing the encrypted or decrpted character to the file
if(fputc(targetChar,outputFile) == EOF)
{
perror(outName);
exit(EXIT_FAILURE);
}
}
fclose(inputFile);
fclose(outputFile);
前两个字符 fgetc() 工作正常,它根本不读取,同时 currentLocation
正在稳步增加。
如果文件有以下内容
Hello world !!
输出是
Heelo world !!
或
Heeeeeeeeeeeeeeeeeeeeeeeee ...
e
的数量取决于程序运行的时间,它是一个无限循环。
我正在使用 fseek() 向后移动,即使我只向后移动 fseek()
,这是否清除了 EOF
(导致无限循环条件)?我在调试器中检查了 fgetc()
没有读取超过两个字符,但是 currentLocation
正在以 1 的增量移动,为什么 fgetc() 没有读取超过两个字符?
if(fputc(targetChar,outputFile) == EOF)
{
perror(outName);
exit(EXIT_FAILURE);
}
fflush(outputFile);//need flush
}
fclose(inputFile);
//fclose(outputFile);//double close!
我正在尝试加密(简单的位操作算法)一个文件,为此我创建了三个不同的版本
- 在加密或解密过程中创建新文件并删除旧文件并重命名
- 加密或解密发生在同一个文件上,使用两个不同的
File *
,一个在rb
中打开文件,另一个在rb+
中打开同一个文件。 - 加密或解密发生在同一个文件上,只使用一个
FILE*
,文件以rb+
模式打开。
前两个版本按预期工作,它们不使用 fseek(),但我在版本 3 中遇到问题
v3 代码:
FILE *inputFile= NULL,*outputFile = NULL;
char *inName = "file.txt",*outName;
/* I am using same source file for all three version controlled by #if, so the following assignment is necessary*/
outName = inName;
inputFile = fopen(inName,"rb+");
if(inputFile == NULL)
{
perror(inName);
exit(EXIT_FAILURE);
}
/* I am using same source file for all three version controlled by #if, so the following assignment is necessary*/
outputFile = inputFile;
long int currentLocation;
unsigned char targetChar;
int intChar;
long int offset,temp;
while(currentLocation = ftell(inputFile),(intChar = fgetc(inputFile))!= EOF)
{
targetChar = intChar;
/*#if encryption
encrypt(&targetChar);
#else
decrypt(&targetChar);
#endif // encryption*/
/* going back in the file to the starting position of currently read character*/
temp = currentLocation;
currentLocation = ftell(inputFile);
offset = temp - currentLocation; // the offset is always -1 throughout the program(gdb)
if(fseek(inputFile,offset,SEEK_CUR)==-1)
{
perror(outName);
exit(EXIT_FAILURE);
}
// writing the encrypted or decrpted character to the file
if(fputc(targetChar,outputFile) == EOF)
{
perror(outName);
exit(EXIT_FAILURE);
}
}
fclose(inputFile);
fclose(outputFile);
前两个字符 fgetc() 工作正常,它根本不读取,同时 currentLocation
正在稳步增加。
如果文件有以下内容
Hello world !!
输出是
Heelo world !!
或
Heeeeeeeeeeeeeeeeeeeeeeeee ...
e
的数量取决于程序运行的时间,它是一个无限循环。
我正在使用 fseek() 向后移动,即使我只向后移动 fseek()
,这是否清除了 EOF
(导致无限循环条件)?我在调试器中检查了 fgetc()
没有读取超过两个字符,但是 currentLocation
正在以 1 的增量移动,为什么 fgetc() 没有读取超过两个字符?
if(fputc(targetChar,outputFile) == EOF)
{
perror(outName);
exit(EXIT_FAILURE);
}
fflush(outputFile);//need flush
}
fclose(inputFile);
//fclose(outputFile);//double close!