C - 使用fgetc在枚举'class'中存储值

时间:2012-04-18 04:27:10

标签: c struct enums fgetc

我正在编写一个程序,接受包含数据库条目的文件。条目都采用相同的格式,数据顺序相同。文件中的第一个数字是条目数。然后数据看起来像这样: LastName FirstName StudentID年份GPA expectedGraduationDate

例: Doe John 12345678 23 freshman 4.0 2013

我的问题是年份价值。我们应该将它声明为类型'class',它应该是enum class{freshman, sophomore, junior, senior, grad};

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

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

*更新错误

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做的事情,或者我只是做错了。建议?

2 个答案:

答案 0 :(得分:1)

程序中有很多错误,但是一开始

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

2)strcpy将目标作为第一个参数,因此这不起作用  strcpy(buffer, record[i]->last);

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

分配内存

4)strcpy用于复制字符串,因此如果你不想存储到float或int即gpa等,你需要使用memcpy,缓冲区的值也应该使用{{}来转换。 1}} strol

也会建议你掌握这本书K&R这对加班非常有用

答案 1 :(得分:0)

为什么要尝试strcpy int字符串复制),例如expGradYear

strcpy适用于STRINGS。如果要将int附加到缓冲区,请使用memcpy MEMory 复制)