从文件中读取,输出只显示一行
Read from file, output only display one line
我想从文件 newdata.dat 中读取一些数据,其中有 5 个数据。我的程序应该输出全部 5 个数据:
323 贝利,比尔 922.00
163 比恩,吉姆 2023.00
183 丹尼尔斯,杰克 3932.00
123 Doe, John 1022.00
121 史密斯,山姆 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 */
您的代码进行了一些重复计算:一方面,它执行了 100 次读取;另一方面,它执行了 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
的 return 值。
强烈建议使用 fgets() 一次只读取一行。
文件中的字段大小与结构中的字段大小不匹配,
所以直接读取 info[x] 是行不通的。
使用 fgets() 读取缓冲区
(缓冲区足够长以容纳最大行长度(加上一些额外的空间)
然后使用(例如)strtok()
从缓冲区中解析字段
然后使用类似 strtod() 的方法转换浮点值,
然后将该值分配给浮点字段。
对于char字段,解析后,
使用 strcpy() 将字符串放入字段中,
当 fgets returns null
时退出循环
我想从文件 newdata.dat 中读取一些数据,其中有 5 个数据。我的程序应该输出全部 5 个数据:
323 贝利,比尔 922.00
163 比恩,吉姆 2023.00
183 丹尼尔斯,杰克 3932.00
123 Doe, John 1022.00
121 史密斯,山姆 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 */
您的代码进行了一些重复计算:一方面,它执行了 100 次读取;另一方面,它执行了 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
的 return 值。
强烈建议使用 fgets() 一次只读取一行。
文件中的字段大小与结构中的字段大小不匹配, 所以直接读取 info[x] 是行不通的。
使用 fgets() 读取缓冲区
(缓冲区足够长以容纳最大行长度(加上一些额外的空间)
然后使用(例如)strtok()
从缓冲区中解析字段然后使用类似 strtod() 的方法转换浮点值,
然后将该值分配给浮点字段。
对于char字段,解析后,
使用 strcpy() 将字符串放入字段中,
当 fgets returns null
时退出循环