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
从C中的文件创建结构数组_C_Arrays - Fatal编程技术网

从C中的文件创建结构数组

从C中的文件创建结构数组,c,arrays,C,Arrays,我试图用C语言创建一个结构数组。这就像将文件中的信息读入一个结构一样简单,但我不断收到两条警告消息,关于用我的两个字符(数字/颜色)进行读取,以及程序似乎只对每个值读取零 #include<stdio.h> #include<string.h> typedef struct car { int year; char number[9]; char colour[10]; float engine; } car_type[6]; int

我试图用C语言创建一个结构数组。这就像将文件中的信息读入一个结构一样简单,但我不断收到两条警告消息,关于用我的两个字符(数字/颜色)进行读取,以及程序似乎只对每个值读取零

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

typedef struct car
{
    int year;
    char number[9];
    char colour[10];
    float engine;
} car_type[6];

int main()
{
    car_type car;
    int i;
    FILE*fptr;

    fptr = fopen("indata.txt", "r");

    while (!feof(fptr))
    {
        fscanf(fptr, "%d %c %c %f", &car[i].year, &car[i].number,
                &car[i].colour, &car[i].engine);
        i++;
    }

    fclose(fptr);

    return 0;
}
#包括
#包括
结构车
{
国际年;
字符数[9];
炭色[10];
浮子发动机;
}汽车类型[6];
int main()
{
轿车型轿车;
int i;
文件*fptr;
fptr=fopen(“indata.txt”,“r”);
而(!feof(fptr))
{
fscanf(fptr,“%d%c%c%f”,&car[i]。年份,&car[i]。编号,
&汽车[i]。颜色和汽车[i]。发动机);
i++;
}
fclose(fptr);
返回0;
}

我没有测试这个“代码”。你应该应用的正确策略是:
1) 查找文件大小
2) 分配缓冲区
3) 在其中读取整个文件
4) 知道它包含多少字符串('\n')(在while循环中)
5) 在for循环中处理缓冲区(i=0;i
#包括
#包括
#包括
#定义BUF 64
typedef结构\u CarType
{  
国际年;
整数;
内部色彩;
双引擎;
}卡式;
int main(int argc,char argv[]
{  
cartypecar[6];
文件*fp=fopen(“indata.txt”、“r”);
如果(fp!=NULL)
{  
int i=0;
而(!feof(fp))
{  
字符年份[BUF]、颜色[BUF]、引擎1[BUF]、引擎1[BUF]、编号[BUF];
memset(年份,'\0',BUF);
内存集(颜色,'\0',BUF);
memset(引擎1,'\0',BUF);
memset(engine2,'\0',BUF);
memset(编号“\0”,BUF);
fscanf(fp,“%s%s%s.%s”,年份、编号、颜色、引擎1、引擎2);
car[i]。年=atoi(年);
汽车[i]。编号=atoi(编号);
汽车[i]。颜色=atoi(颜色);
汽车[i]。发动机=atoi(发动机1);
汽车[i]。发动机+=(atoi(发动机2))/(10*strlen(发动机2));
i++;
}  
fclose(fp);
}  
返回0;
}

这些是字符串,不是单个字符。使用
%s
。投票以简单的输入错误结束这一过程。这种类型的typedef混合结构和固定大小数组可能不是最清晰的编码方式。。。如果typedeffing结构真的有用,这是有争议的<代码>结构车[6]作为主要的局部变量声明将使代码更容易理解。
i
无论如何都是一个未初始化的变量,因此行为是未定义的。另外:始终检查*
scanf
函数的返回值,打印IO错误,并以某种方式处理解析错误。请在(fscanf(fptr,“%d%s%s%f”,&car[i]。年份,car[i]。编号,car[i]。颜色,&car[i]。引擎)==4{i++;}但实际上我会用
fgets
阅读每一行,然后应用
sscanf
。请不要在没有解释错误或如何/为什么更改它的情况下扔下一堵代码墙。非常感谢你的帮助-我对编程基本上是新手,刚刚被分配了这个任务,所以我很困!你的解释帮助有很多-我可以问一下,for循环到底应该去哪里?只要你能尝试使用“for”而不是“while”。它会限制代码避免可能的错误。你可以问-在哪里使用“for”,我的答案是,而不是while。顺便说一句,好的做法是检查malloc、fopen等返回的内容。感谢您的帮助!我几乎要休息了,但计划在一个小时左右完成代码,如果我把它弄清楚的话(我想我会的,因为我现在知道该怎么做了)你介意指出一些可以更好格式化的地方吗?不介意。程序员最好的导师是gdb和valgrind。他们会帮助你的。
#include <stdio.h>   
#include <string.h>  
#include <stdlib.h>  

#define BUF 64  
typedef struct _CarType  
{  
    int year;  
    int number;  
    int colour;  
    double engine;  
} CarType;  

int main(int argc, char argv[])  
{  
    CarType car[6];  

    FILE* fp = fopen("indata.txt","r");  
    if(fp != NULL)  
    {  
        int i = 0;  
        while(!feof(fp))  
        {  
            char year[BUF], colour[BUF], engine1[BUF], engine1[BUF], number[BUF];  
            memset(year,     '\0', BUF);  
            memset(colour,   '\0', BUF);  
            memset(engine1,  '\0', BUF);  
            memset(engine2,  '\0', BUF);  
            memset(number,   '\0', BUF);  

            fscanf(fp, "%s %s %s %s.%s", year, number, colour, engine1, engine2);  
            car[i].year      =    atoi(year);  
            car[i].number    =    atoi(number);  
            car[i].colour    =    atoi(colour);  
            car[i].engine    =    atoi(engine1);  
            car[i].engine    +=   (atoi(engine2)) / (10 * strlen(engine2));  

            i++;  
        }  
        fclose(fp);  
    }  
    return 0;  
}