Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何读取txt文件并将信息放入C中的struct中?_C_Struct_Fread - Fatal编程技术网

如何读取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

我试图读取txt文件并将信息放入C类项目的结构中。我的代码似乎没有读取文件并将信息放入struct。我读了很多博客文章,但我找不到或纠正我的错误

#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;                                                                  
}