提问人:Hugh 提问时间:8/27/2019 最后编辑:Vlad from MoscowHugh 更新时间:8/27/2019 访问量:194
遍历 fread 语句 [duplicate]
Looping through fread statements [duplicate]
问:
需要遍历 fread 语句并打印每个语句。但是,feof 在末尾打印了一行额外的行
代码有效(如获得正确的输出)只需要没有多余的行
一个 一个 一个 一个 一个 一个 一个 一个 一个 一个 一个 一个 一个 一个 一个 一个 一个
一个
struct item input;
FILE *fptr;
fptr = fopen(argv[1], "rb");
if(!fptr){
FILE *fpOut = fopen(argv[1], "w");
int c;
}
if(fptr == NULL){
fprintf(stderr, "\nError opening file\n");
exit(1);
fseek(fptr, 0, SEEK_SET);
}
while(!feof(fptr)){
fread(&input.business, sizeof(float), 1, fptr);
fread(&input.jellyfish, sizeof(char), 1, fptr);
fread(&input.death, sizeof(input.death), 1, fptr);
fread(&input.love, sizeof(input.love),1,fptr);
fread(&input.ornament, sizeof(input.ornament), 1, fptr);
fread(&input.taste, sizeof(input.taste),1,fptr);
fread(&input.cloth, sizeof(input.cloth),1,fptr);
fread(&input.name, sizeof(input.name),1,fptr);
fread(&input.camera, sizeof(input.camera),1,fptr);
fread(&input.attraction, sizeof(input.attraction),1,fptr);
fread(&input.bottle, sizeof(input.bottle),1,fptr);
fread(&input.stage, sizeof(input.stage),1,fptr);
fread(&input.square, sizeof(input.square),1,fptr);
fread(&input.bushes, sizeof(input.bushes),1,fptr);
fread(&input.heat, sizeof(input.heat),1,fptr);
fread(&input.fly, sizeof(input.fly),1,fptr);
printf("%f ", input.business);
printf("%c ", input.jellyfish);
printf("%d ", input.death);
printf("%c, ", input.love);
printf("%d, ", input.ornament);
printf("%f, ", input.taste);
printf("%ld, ", input.cloth);
printf("%d, ", input.name);
printf("%d, ", input.camera);
printf("%d, ", input.attraction);
printf("%d, ", input.bottle);
printf("%u, ", input.stage);
printf("%f, ", input.square);
printf("%d, ", input.bushes);
printf("%s, ", input.heat);`
printf("%d \n", input.fly);
答:
0赞
Vlad from Moscow
8/27/2019
#1
的检查发生在 之后。eof()
fread
while(!feof(fptr)){
fread(&input.business, sizeof(float), 1, fptr);
//...
printf("%f ", input.business);
//...
}
因此,调用 可能会失败,并且相应参数的前一个值将通过调用输出。fread
printf
来自 C 标准(7.21.8.1 折痕函数)
3 fread 函数返回成功读取的元素数, 如果读取错误或文件末尾 遇到。如果 size 或 nmemb 为零,则 fread 返回零,并且 数组的内容和流的状态保持不变
我可以建议以下方法来完成您的任务。
enum { N = 16 }; // number of fread calls
size_t n = 0, prev_n = 0;
do
{
switch ( n )
{
case 0:
n += fread( &input.business, sizeof(float), 1, fptr );
break;
case 1:
n += fread(&input.jellyfish, sizeof(char), 1, fptr );
break;
case 2:
n += fread(&input.death, sizeof(input.death), 1, fptr );
break;
// ...
}
} while ( prev_n != n && ( prev_n = n ) < N );
for ( size_t i = 0; i < n; i++ )
{
switch ( i )
{
case 0:
printf("%f ", input.business);
break;
case 1:
printf("%c ", input.jellyfish);
break;
case 2:
printf("%d ", input.death);
break;
//...
}
}
这是一个演示程序,展示了该方法的实际应用。
#include <stdio.h>
int main(void)
{
enum { N = 3 };
int a[N];
size_t n = 0, prev_n = 0;
do
{
switch ( n )
{
case 0:
n += scanf( "%d", a + n );
break;
case 1:
n += scanf( "%d", a + n );
break;
case 2:
n += scanf( "%d", a + n );
break;
}
// ...
} while ( prev_n != n && ( prev_n = n ) < N );
for ( size_t i = 0; i < n; i++ )
{
switch ( i )
{
case 0:
printf( "%d ", a[i] );
break;
case 1:
printf( "%d ", a[i] );
break;
case 2:
printf( "%d ", a[i] );
break;
//...
}
}
return 0;
}
如果输入是
1 2 3
那么输出也是
1 2 3
评论
feof
不告诉是否可以进行下一次读取。它告诉上一次读取是否遇到 EOF。