我想从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 */
答案 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时退出循环