使用结构时遇到fscanf问题

时间:2015-09-25 04:37:27

标签: c struct scanf

typedef struct computer
{
char serialNumber[8];
int price;
int GBofRAM;
int GBofHardDrive;
}Computer;

Computer* readComputers(char* filename);


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

if(argc!=2){
    printf("Invalid number of arguments");
    return 1;
}
Computer* x=readComputers(argv[1]);
printComputers(x);

free(x);
return (EXIT_SUCCESS);
}
Computer* readComputers(char* filename)
{

Computer* cptr=malloc(sizeof(Computer)*6);
FILE* fp=fopen(filename, "r");
if(fp==NULL){
    printf("Failed to open file %s", filename);
    return;
}
//fread(cptr, sizeof(Computer), 6, fp);

fscanf(fp,"%s, %d, %d, %d", Computer->serialNumber, &Computer->price, &Computer->GBofRAM, &Computer->GBofHardDrive);

fclose(fp);  
return cptr;

我遇到问题让fscanf()正常工作。它说它在Computer->serialNumber之前缺少一个表达式,但我不确定为什么会这样呢?我试过看Tutorialspoint,但这并没有太多的帮助。

2 个答案:

答案 0 :(得分:4)

根据您的代码,

Computer->serialNumber

是无效的陈述。 Computer这里是(用户定义的)数据类型。你不能贬低那个。您需要使用cptr作为已定义的变量名称。

此外,在使用返回的指针之前,请始终检查malloc()是否成功。否则,如果malloc()失败,您将通过访问无效指针来调用未定义的行为。

答案 1 :(得分:2)

在函数Computer* readComputers(char* filename)

Computer* cptr=malloc(sizeof(Computer)*6);

你有指向struct cptr的指针,用它来访问struct的成员。

像这样写fscanf -

while(fscanf(fp,"%7s, %d, %d, %d", 
        cptr->serialNumber, &cptr->price, &cptr->GBofRAM, &cptr->GBofHardDrive)==4){
       // do something with these variables
   }         //loop as OP has mentioned in comment

同时检查fscanf的返回。