从文件读取,输出只显示一行

时间:2015-03-23 00:45:15

标签: c file loops io

我想从newdata.dat文件中读取一些数据,其中包含5个数据。我的程序应该输出所有5个数据:

323 Bailey,Bill 922.00

163 Bean,Jim 2023.00

183 Daniels,Jack 3932.00

123 Doe,John 1022.00

121 Smith,Sam 512.00

但我的输出只显示1行数据。请指教?感谢。

埃利

示例代码:

#include <stdio.h>
#include <string.h>

main () {

/* Define Structure */
/* ---------------- */

struct emp
{
    int     id_num;     /* employee number */
    float   salary;     /* employee salary */
    char    first_name[20]; /* employee first name */
    char    last_name[30];  /* employee last name */
};


/* Declare variables */
/* ----------------- */
struct emp info[100];   /* a maximum 100 people can be stored */
FILE    *in_file_ptr:
int     i;


/* Open the input file. If error, display message and exit the program */
/* --------------------------------------------------------------- */
in_file_ptr = fopen("newdata.dat", "rb");
if (!in_file_ptr)
{
    printf ("\nCannot open file newdata.dat for reading.\n");
    return 1;
}


for ( i = 0; i < 100; i++ )
{
    /* Read data from input file and load array struct for processing */
    fread (&info[i], sizeof(info[i]), 100, in_file_ptr);

    /* concatenate first name anda last name */     
    strcat  (info[i].last_name, info[i].first_name);

    printf ("%10i %20s %-10.2f\n", info[i].id_num, 
        info[i].last_name, info[i].salary);


    if(feof(in_file_ptr))break;

} /* end for loop */

fclose (in_file_ptr);

} /* end of  main */

2 个答案:

答案 0 :(得分:0)

你的代码做了一些重复计算:一方面,它执行100次读取;另一方面,它指示fread读取100条记录。由于第一个fread会占用文件中的所有记录,因此循环会立即退出feof

你应该立即阅读整个内容,如下所示:

size_t count = fread (&info[i], sizeof(info[i]), 100, in_file_ptr);
for (size_t i = 0 ; i != count ; i++) {
    ... // no reading or checking feof here
}

或更改fread以读取单个记录,如下所示:

if (fread (&info[i], sizeof(info[i]), 1, in_file_ptr) != 1) break;
//                                ^

请注意,在使用feof时,您应该在阅读之后和使用已阅读的任何数据之前进行检查。您还应该检查fread的返回值。

答案 1 :(得分:0)

强烈建议使用fgets()一次只读取一行。

文件中的字段大小与结构中的字段大小不匹配, 所以直接阅读info [x]是行不通的。

使用fgets()读入缓冲区

(其中缓冲区足够长以保持最大行长(加上一些额外的空间)

然后使用(例如)strtok()

将字段解析出缓冲区

然后使用strtod(),

之类的东西转换浮点值

然后将该值赋给float字段。

对于char字段,解析后,

使用strcpy()将字符串放入字段

当fgets返回null时

退出循环