Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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-使用fgetc在enum'中存储值;类别';_C_Struct_Enums_Fgetc - Fatal编程技术网

C-使用fgetc在enum'中存储值;类别';

C-使用fgetc在enum'中存储值;类别';,c,struct,enums,fgetc,C,Struct,Enums,Fgetc,我正在编写一个程序,它接受一个包含数据库条目的文件。所有条目的格式都相同,数据的顺序也相同。文件中的第一个数字是条目数。然后数据如下所示: LastName FirstName学生ID年龄年份GPA预期成绩日期 例: Doe John 12345678 23大一新生4.0 2013 我的问题是年份值。我们应该将它声明为'class'类型,它应该是enum类{大一、大二、大三、大四、大四} 我有一个带有以下声明的头文件: typedef enum {firstYear, sophomore, ju

我正在编写一个程序,它接受一个包含数据库条目的文件。所有条目的格式都相同,数据的顺序也相同。文件中的第一个数字是条目数。然后数据如下所示: LastName FirstName学生ID年龄年份GPA预期成绩日期

例: Doe John 12345678 23大一新生4.0 2013

我的问题是年份值。我们应该将它声明为'class'类型,它应该是
enum类{大一、大二、大三、大四、大四}

我有一个带有以下声明的头文件:

typedef enum {firstYear, sophomore, junior, senior, grad} class;
然后我的主文件:

#include <stdio.h>
#include <stdlib.h>
#include "class.h"

int main(int argc, char *argv[]){

typedef struct{
        int DBrecordID;         //ID for each entry, range 0-319
        char *last;             //student last name
        char *first;            //student first name
        char studentID[8];      //student ID
        int age;                //student age
        class year;             //year in school
        float gpa;              //GPA
        int expGradYear;        //expected graduation year
}DBrecord;
int numEntries;
DBrecord **record;
char buffer[80];
FILE *fpt;
int c, i;
int j = 0;

//check for invalid file arguments
if(argc != 2){
        printf("Number of arguments is invalid\n");
        exit(1);
}

//error if unable to open file
if((fpt = fopen(argv[1], "r")) == NULL){
        printf("Error: Couldn't open file.\n");
        exit(1);
}

//set file pointer to read passed file
fpt = fopen(argv[1], "r");

//scan first int in file and assign to numEntries
//fscanf(fpt, "%d", &numEntries);

//allocate memory for structures, each is 36 bytes
*record = malloc (sizeof (DBrecord) * numEntries);

//loop through each DB entry
do{
        for(i=0; i<numEntries; i++){
                numEntries = record[i]->DBrecordID;
                do{
                        c=fgetc(fpt);
                        buffer[j++] = c;
                }while(c != ' ');
                        strcpy(record[i]->last, buffer);
                        j=0;
                do{
                        c=fgetc(fpt);
                        buffer[j++] = c;
                }while(c != ' ');
                        strcpy(record[i]->first, buffer);
                        j=0;
                do{
                        c=fgetc(fpt);   
                        buffer[j++] = c;
                }while(c != ' ');
                        strcpy(record[i]->studentID, buffer);
                        j=0;
                do{
                        c=fgetc(fpt);
                        memcpy(c, buffer[j++], 1);
               }while(c != ' ');
                        memcpy(buffer, record[i]->year, 4);
                        j=0;
                do{
                        c=fgetc(fpt);
                        buffer[j++] = c;
                }while(c != ' ');
                        memcpy(buffer, record[i]->gpa, 4);
                        j=0;
                do{  
                        c=fgetc(fpt);
                        buffer[j++] = c;
                }while(c != ' ' || c != '\n');
                        memcpy(buffer, record[i]->expGradYear, 4);
                        j=0;
         }
}while(c != EOF);

return 0;
}
#包括
#包括
#包括“h类”
int main(int argc,char*argv[]){
类型定义结构{
int DBrecordID;//每个条目的ID,范围为0-319
char*last;//学生姓
char*first;//学生的名字
char studentID[8];//学生ID
int年龄;//学生年龄
班级年份;//在校年份
浮点gpa;//gpa
int expgradeyear;//预期毕业年份
}数据库记录;
国际货币基金组织;
数据库记录**记录;
字符缓冲区[80];
文件*fpt;
int c,i;
int j=0;
//检查无效的文件参数
如果(argc!=2){
printf(“参数数量无效\n”);
出口(1);
}
//无法打开文件时出错
if((fpt=fopen(argv[1],“r”)==NULL){
printf(“错误:无法打开文件。\n”);
出口(1);
}
//将文件指针设置为读取传递的文件
fpt=fopen(argv[1],“r”);
//扫描文件中的第一个int并分配给numEntries
//fscanf(fpt、%d、&numEntries);
//为结构分配内存,每个为36字节
*记录=malloc(sizeof(DBrecord)*numEntries);
//循环遍历每个数据库条目
做{
对于(i=0;iDBrecordID;
做{
c=fgetc(fpt);
缓冲区[j++]=c;
}而(c!=”;
strcpy(记录[i]->last,缓冲区);
j=0;
做{
c=fgetc(fpt);
缓冲区[j++]=c;
}而(c!=”;
strcpy(记录[i]->第一个,缓冲区);
j=0;
做{
c=fgetc(fpt);
缓冲区[j++]=c;
}而(c!=”;
strcpy(记录[i]->studentID,缓冲区);
j=0;
做{
c=fgetc(fpt);
memcpy(c,buffer[j++],1);
}而(c!=”;
memcpy(缓冲区,记录[i]>年份,4);
j=0;
做{
c=fgetc(fpt);
缓冲区[j++]=c;
}而(c!=”;
memcpy(缓冲区,记录[i]->gpa,4);
j=0;
做{
c=fgetc(fpt);
缓冲区[j++]=c;
}而(c!=''| | c!='\n');
memcpy(缓冲区,记录[i]>expGradYear,4);
j=0;
}
}而(c!=EOF);
返回0;
}
*更新错误

main.c:75:警告:传递'memcpy'的arg 1将从整数生成指针,而不进行强制转换

main.c:75:警告:传递'memcpy'的arg 2将从整数生成指针,而不进行强制转换

main.c:77:'memcpy'的参数2的类型不兼容

main.c:83:'memcpy'的参数2的类型不兼容

main.c:89:警告:传递'memcpy'的arg 2将从整数生成指针,而不进行强制转换

main.c:94:“DBrecord”之前的解析错误


所以我假设我不能用memcpy做我想做的事情,或者我只是做错了。建议?

为什么你要尝试从
int
复制
strcpy
StringCopy),比如
expGradYear


strcpy
用于字符串。如果要在缓冲区中附加int,请使用
memcpy
MEMoryCopy)

程序中有很多错误,只是为了开始

1)
record
的类型应为
DBrecord*
而不是
DBrecord**

2)
strcpy
将destination作为第一个参数,因此这不起作用
strcpy(缓冲区,记录[i]>last)

3) 您还需要为
记录[i]->last

4)
strcpy
用于复制字符串,因此,如果您不想存储为float或int,即gpa等,则需要使用
memcpy
还应使用
strol
strod
转换缓冲区中的值


我还建议你拿着这本书,这本书会对你很有帮助。我很确定我正确地声明了
record
。我需要一个双指针来同时指向结构的两个部分,
DBrecord
DBrecord.last
DBrecord.first
等。感谢
strcpy
提示,我发现我得到了向后的参数。至于内存分配,我使用了
*record=malloc(sizeof(DBrecord)*numEntries)为什么我需要分配更多内存?最后,我想我需要帮助理解
memcpy
。如果
memcpy
不关心传递的类型,为什么需要转换缓冲区?谢谢你的帮助!“我知道我看起来一定很无知。@当你使用
DBrecord**record
*record=malloc
时,马纳利什让我们先看看DBrecord。记录并没有初始化,所以
*record
会出现seg故障,我想你们想要的是DBrecord的数组,它是
DBrecord*
,因为数组会衰减到指针。其次,当为诸如last_name之类的字段分配sizeof(DbRecord)时,您分配的是指针的大小,但指针
last_name
现在需要初始化为有效地址,以便