从C中的文件创建结构数组
我试图用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
#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;
}