use*_*758 3 c file input output
我无法弄清楚为什么我的while循环不起作用.代码在没有它的情况下正常工作......代码的目的是在bin文件中查找秘密消息.所以我得到了代码来查找字母,但现在当我尝试将其循环到文件末尾时,它不起作用.我是新来的.我究竟做错了什么?
main(){
FILE* message;
int i, start;
long int size;
char keep[1];
message = fopen("c:\\myFiles\\Message.dat", "rb");
if(message == NULL){
printf("There was a problem reading the file. \n");
exit(-1);
}
//the first 4 bytes contain an int that tells how many subsequent bytes you can throw away
fread(&start, sizeof(int), 1, message);
printf("%i \n", start); //#of first 4 bytes was 280
fseek(message, start, SEEK_CUR); //skip 280 bytes
keep[0] = fgetc(message); //get next character, keep it
printf("%c", keep[0]); //print character
while( (keep[0] = getc(message)) != EOF) {
fread(&start, sizeof(int), 1, message);
fseek(message, start, SEEK_CUR);
keep[0] = fgetc(message);
printf("%c", keep[0]);
}
fclose(message);
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
编辑:
在调试器中查看我的代码后,看起来在while循环中使用"getc"会将所有内容都抛弃.我通过创建一个名为letter的新char来修复它,然后用以下代码替换我的代码:
fread(&start, sizeof(int), 1, message);
fseek(message, start, SEEK_CUR);
while( (letter = getc(message)) != EOF) {
printf("%c", letter);
fread(&start, sizeof(int), 1, message);
fseek(message, start, SEEK_CUR);
}
Run Code Online (Sandbox Code Playgroud)
它现在就像一个魅力.当然,欢迎提出更多建议.感谢大家.
Jon*_*ler 16
来自getc()
及其亲属的返回值是a int
,而不是a char
.
如果将结果赋给getc()
a char
,则返回时会发生以下两种情况之一EOF
:
char
是无符号的,那么EOF将转换为0xFF,并且0xFF!= EOF,因此循环永远不会终止.char
是有符号的,那么EOF相当于一个有效字符(在8859-1代码集中,即ÿ,y-umlaut,U + 00FF,LATIN SMALL LETTER Y WITH DIAERESIS),你的循环可能会提前终止.鉴于你遇到的问题,我们可以暂时猜测你有简单char
的无符号类型.
getc()
等人返回的原因int
是他们必须返回每个可能适合a char
和不同值EOF的值.在C标准中,它说:
ISO/IEC 9899:2011§7.21.7.1该
fgetc()
功能
int fgetc(FILE *stream);
如果未指定指向的输入流的文件结束指示符
stream
并且存在下一个字符,则该fgetc
函数将该字符unsigned char
转换为int
...如果设置了流的文件结束指示符,或者流位于文件结尾,则设置流的文件结束指示符并且
fgetc
函数返回EOF.
类似的措辞适用于getc()
函数和getchar()
函数:它们的定义与fgetc()
函数类似,只是如果getc()
实现为宏,它可能需要通常不会授予标准宏的文件流参数 - 特别是流参数表达式可能会被评估多次,所以getc()
使用副作用(getc(fp++)
)调用是非常愚蠢的(但改变fgetc()
它并且它将是安全的,但仍然是古怪的).
在循环中,您可以使用:
int c;
while ((c = getc(message)) != EOF) {
keep[0] = c;
Run Code Online (Sandbox Code Playgroud)
这保留了作业keep[0]
; 我不确定你真的需要它.
您应该检查对方通话fgets()
,getc()
,fread()
以确保你得到你所期望的输入内容.特别是在输入时,你真的不能跳过这些检查.如果你没有虔诚地检查返回状态,那么你的代码可能会崩溃,或者只是"出错".
归档时间: |
|
查看次数: |
12542 次 |
最近记录: |