0

データベースエントリを含むファイルを受け入れるプログラムを作成しています。エントリはすべて同じ形式で、データは同じ順序です。ファイルの最初の数字はエントリの数です。その場合、データは次のようになります。LastNameFirstNameStudentID年齢年GPAexpectedGraduationDate

例:Doe John1234567823新入生4.02013

私の問題は年の値です。タイプ「クラス」として宣言することになっています。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'の引数1を渡すと、キャストなしで整数からポインターが作成されます

main.c:75:警告: `memcpy'の引数2を渡すと、キャストなしで整数からポインターが作成されます

main.c:77:`memcpy'の引数2と互換性のない型

main.c:83:`memcpy'の引数2と互換性のない型

main.c:89:警告: `memcpy'の引数2を渡すと、キャストなしで整数からポインターが作成されます

main.c:94:「DBrecord」の前の解析エラー

ですから、私はmemcpyでやろうとしていることができないか、間違っているだけだと思います。提案?

4

2 に答える 2

1

プログラムにはかなりの数のエラーがありますが、最初は

1)recordタイプでDBrecord*はないDBrecord**

2)strcpy宛先を最初の引数として取るため、これは機能しません strcpy(buffer, record[i]->last);

3)メモリを割り当てる必要もありますrecord[i]->last

4) strcpy文字列をコピーするために使用されるため、floatまたはint、つまりgpaなどに保存したくない場合はmemcpy、バッファからの値も使用する必要があります。strol strod

また、この本を手に入れることをお勧めしますK&Rそれは残業に本当に役立ちます

于 2012-04-18T04:40:55.203 に答える
0

のようなものからstrcpy(文字列のコピー)を試みるのはなぜですか?intexpGradYear

strcpySTRINGS用です。バッファーに int を追加する場合は、memcpy( MEMory Copy)を使用します。

于 2012-04-18T04:31:55.650 に答える