如何读取txt文件并将信息放入C中的struct中?
我试图读取txt文件并将信息放入C类项目的结构中。我的代码似乎没有读取文件并将信息放入struct。我读了很多博客文章,但我找不到或纠正我的错误如何读取txt文件并将信息放入C中的struct中?,c,struct,fread,C,Struct,Fread,我试图读取txt文件并将信息放入C类项目的结构中。我的代码似乎没有读取文件并将信息放入struct。我读了很多博客文章,但我找不到或纠正我的错误 #include <stdio.h> #include <stdlib.h> #include <string.h> struct flightData { char airline[9]; int flightCode; char departureAirport[3]; ch
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct flightData {
char airline[9];
int flightCode;
char departureAirport[3];
char destinationAirport[3];
int passengerCapacity;
int depTimeHour;
int depTimeMin;
int arvTimeHour;
int arvTimeMin;
};
int main(){
FILE *flightFile;
flightFile = fopen("flights.txt","r");
int flightCount=0;
struct flightData input[10];
if (flightFile == NULL)
{
fprintf(stderr, "\nError opening file\n");
exit (1);
}
while (fscanf(flightFile,"%s %d %s %s %d %d:%d %d:%d", input[flightCount].airline,&input[flightCount].flightCode,input[flightCount].departureAirport,input[flightCount].destinationAirport
,&input[flightCount].passengerCapacity,&input[flightCount].depTimeHour,&input[flightCount].depTimeMin,&input[flightCount].arvTimeHour,&input[flightCount].arvTimeMin)!= EOF){
flightCount++;
printf ("%s\n",input[flightCount].airline);
}
fclose(flightFile);
return 0;
}
根据这段代码,我得到了以下结果:
X����
p+� 除了问题注释中提到的错误之外,最严重的错误是行
flightCount++;
printf ("%s\n",input[flightCount].airline);
其中索引flightCount
在访问输入
数组之前递增,因此检索未初始化的值。交换这两行代码,按照上面的建议去做,它会看起来更好。你绝对不能在scanf
中使用“%s”
。它并不比获取
更好。要在scanf中安全地使用%s
,必须在转换说明符中使用小于缓冲区大小的最大字段宽度scanf
读取的字符数将不超过指定的字符数,并将写入读取的字符加上空终止符。代码中还有一些其他(大部分是琐碎的)问题。尝试以下方法:
int
main(int argc, char **argv)
{
const char *path = argc > 1 ? argv[1] : "flights.txt";
FILE *flightFile = fopen(path,"r");
int flightCount=0;
struct flightData input[10], *t = input;
if( flightFile == NULL ) {
perror(path);
return EXIT_FAILURE;
}
char fmt[128];
snprintf(fmt, sizeof fmt, "%%%zus %%d %%%zus %%%zus %%d %%d:%%d %%d:%%d",
sizeof t->airline - 1, sizeof t->departureAirport - 1,
sizeof t->destinationAirport - 1);
while( fscanf(flightFile, fmt, t->airline, &t->flightCode,
t->departureAirport, t->destinationAirport,
&t->passengerCapacity, &t->depTimeHour, &t->depTimeMin,
&t->arvTimeHour, &t->arvTimeMin) == 9 )
{
t += 1;
}
fclose(flightFile);
flightCount = t - input;
for( int i = 0; i < flightCount; i++ ){
printf("%s\n", input[i].airline);
}
return 0;
}
int
主(内部argc,字符**argv)
{
const char*path=argc>1?argv[1]:“flights.txt”;
FILE*flightFile=fopen(路径“r”);
int flightCount=0;
结构flightData输入[10],*t=输入;
如果(flightFile==NULL){
佩罗尔(路径);
返回退出失败;
}
char-fmt[128];
snprintf(fmt,fmt大小,“%%%zus%%d%%%zus%%%zus%%d%%d:%%d%%d”,
尺寸t->航空公司-1,尺寸t->出发机场-1,
t的大小->目的地机场-1);
而(fscanf)(飞行文件、fmt、t->airline,&t->flightCode、,
t->出发机场,t->目的地机场,
&t->passengerCapacity,&t->depTimeHour,&t->depTimeMin,
&t->arvTimeHour,&t->arvTimeMin)==9)
{
t+=1;
}
fclose(flightFile);
flightCount=t-输入;
对于(int i=0;i
请注意,您可能需要添加一些附加诊断。给定当前的结构定义(其中字符串太小),此示例将输入while循环的主体零次,并将
flightCount
设置为零,因为scanf
将无法读取输入的第一行。处理留给读者的练习。[3]
太短,无法存储,比如说“LHR”
。它需要是[4]
,并在读取时限制输入%3s
。另外,请将fscanf
与==9
进行比较,而不是与!=EOF
\n错误打开文件\n
是无用错误消息的典型示例。告诉用户导致问题的路径,并报告问题所在perror(“flights.txt”)
…和char航空公司[9]代码>太短,无法存储“汉莎航空”
。它需要至少是[10]
,而且没有长度限制的%s
将发生损坏。非常感谢!这解决了我的问题。
int
main(int argc, char **argv)
{
const char *path = argc > 1 ? argv[1] : "flights.txt";
FILE *flightFile = fopen(path,"r");
int flightCount=0;
struct flightData input[10], *t = input;
if( flightFile == NULL ) {
perror(path);
return EXIT_FAILURE;
}
char fmt[128];
snprintf(fmt, sizeof fmt, "%%%zus %%d %%%zus %%%zus %%d %%d:%%d %%d:%%d",
sizeof t->airline - 1, sizeof t->departureAirport - 1,
sizeof t->destinationAirport - 1);
while( fscanf(flightFile, fmt, t->airline, &t->flightCode,
t->departureAirport, t->destinationAirport,
&t->passengerCapacity, &t->depTimeHour, &t->depTimeMin,
&t->arvTimeHour, &t->arvTimeMin) == 9 )
{
t += 1;
}
fclose(flightFile);
flightCount = t - input;
for( int i = 0; i < flightCount; i++ ){
printf("%s\n", input[i].airline);
}
return 0;
}