【问题标题】:Looping through fread statements [duplicate]循环遍历 fread 语句[重复]
【发布时间】:2019-08-27 10:13:57
【问题描述】:

需要遍历 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);

【问题讨论】:

  • 我读到过——但是,我无法以一种可行的方式将这些方法实现到我的方法中——即使用结构
  • 你应该花点时间创建一个minimal reproducible example
  • feof 不知道是否可以进行下一次读取。它告诉之前的读取是否遇到了 EOF。

标签: c loops struct eof fread


【解决方案1】:

eof() 的检查发生在fread 之后。

while(!feof(fptr)){
    fread(&input.business, sizeof(float), 1, fptr);
    //...
    printf("%f ", input.business);
    //... 
}

所以fread 的调用可能会失败结束,相应参数的先前值将由printf 的调用输出。

来自 C 标准(7.21.8.1 fread 函数)

3 fread函数返回成功读取的元素个数, 如果读取错误或文件结束,则可能小于 nmemb 遭遇。如果 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 2017-07-24
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多