【问题标题】:C - using fgetc to store value in enum 'class'C - 使用 fgetc 将值存储在枚举“类”中
【发布时间】:2012-04-18 04:27:09
【问题描述】:

我正在编写一个程序,它接受一个包含数据库条目的文件。这些条目都采用相同的格式,数据的顺序相同。文件中的第一个数字是条目数。然后数据看起来像这样: 姓 名 StudentID 年龄 GPA 预期毕业日期

例如: Doe John 12345678 23大一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 做我想做的事情,或者我做错了。有什么建议吗?

【问题讨论】:

    标签: c struct enums fgetc


    【解决方案1】:

    程序中有不少错误,但只是开始

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

    2) strcpy 将目的地作为第一个参数,所以这不起作用 strcpy(buffer, record[i]-&gt;last);

    3) 你还需要为record[i]-&gt;last分配内存

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

    也建议去拿这本书K&R加班真的很有帮助

    【讨论】:

    • 我很确定我正确地声明了record。我需要一个双指针来指向结构的两个部分,DBrecord 和DBrecord.last 或DBrecord.first 等。感谢strcpy 提示,我看到我的论点倒退了。至于内存分配,我用了*record = malloc (sizeof (DBrecord) * numEntries); 为什么我需要分配更多的内存?最后,我想我需要帮助理解memcpy。如果memcpy 不关心传递的是什么类型,为什么还需要转换缓冲区?谢谢您的帮助!我知道我一定看起来很无知。
    • @manalishi 让我们先使用 DBrecord,当您使用 DBrecord ** record 和 *record = malloc 时。记录没有初始化,所以*record 会出现段错误,我认为你想要的是DBrecord 数组,它是DBrecord*,因为数组衰减到指针。其次,当为 last_name 之类的字段分配 sizeof(DbRecord) 时,您分配的是指针的大小,但指针 last_name 现在需要初始化为有效地址,因此您需要分配。我建议首先尝试让程序编译,然后使用调试器一一解决逻辑问题
    • 对不起,我没有关注你。你会看看my other post about this,如果你仍然觉得它是错的,请告诉我? cmets 似乎同意了。
    • @manalishi 我不知道你为什么想要一个指向 DbRecord 的指针数组,这里有一个例子来说明为什么你所拥有的东西不起作用:codepad.org/726Vt5RE。我有指针数组,需要为指针数组分配空间,然后为单个指针分配空间,我认为该帖子是错误的。当你说 *rec = malloc() 它假定 rec 指向一个有效地址 DBrecord **rec; 你还没有初始化 rec ,如果你将它初始化为 null 并执行 *rec 你会看到一个段错误
    • 我不得不考虑一整天,但我终于来了,我想我理解了段错误。感谢您让我走上正轨!
    【解决方案2】:

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

    strcpy 用于字符串。如果要将 int 附加到缓冲区,请使用 memcpy (MEMory Copy)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多