2015-06-16 44 views
-3

我試圖從一個文件(「input.txt」)插入數據到一個隊列,我遇到了麻煩。如何將文件中的數據插入隊列的節點?

input.txt中如下:

2 18.487.548-k Juan Rodriguez 35 m 
122 19.658.568-0 Chewbacca Solo 900 m 
5 16.658.487-6 John Travolta 45 m 
23 10.658.479-5 Perl Diamond 18 f 

注: 「空間」 中的數據之間的是選項卡( 「\ t」 的),而不是一個空間。

這是我的數據結構:我使用

/* Person */ 
typedef struct person { 
    int attentionNumber; 
    char id [30]; 
    char firstName [40]; 
    char lastName [40]; 
    int age; 
    char sex[20]; 
}Person; 

/* Node */ 
typedef struct node { 
    Person *person; 
    struct node *next; 
}Node; 

/* Queue*/ 
typedef struct queue { 
    Node *head; 
    Node *tail; 
    int size; 
}Queue; 

功能:

Queue *createQueue(); 
Node *createNode(Person *aPerson, Node *ptro); 
void insert(Person *aPerson, int attentionNumber, char id [30], char firstName [40], char lastName [40], int age, char sex [20]); 
void read(); 
Node *headNode(Queue *c); 
Node *tailNode(Queue *c); 
bool emptyQueue(Queue *c); 

計劃:

Queue *createQueue() 
{ 
    Queue *aQueue; 

    /* memory for the Queue */ 
    if((aQueue = (Queue *) malloc(sizeof(Queue)))) 
    { 
     /* Queue initialize empty */ 
     aQueue->size = 0; 
     /* head and tail pointer -> Null */ 
     aQueue->head = aQueue->tail = NULL; 
    } 
    return aQueue; 
} 

Node *createNode(Person *aPerson, Node *pointer) 
{ 
    Node *aNode; 

    /* memory for the Node */ 
    if((aNode = (Node *) malloc(sizeof(Node)))) 
    { 
     /* values of Node */ 
     aNode->person = aPerson; 
     aNode->next = pointer; 
    } 
    return aNode; 
} 

void insert(Person *aPerson, int attentionNumber, char id [30], char firstName [40], char lastName[40], int age, char sex[20]) 
{ 
    if(aPerson = (Person *) malloc(sizeof(Person))) 
    { 
     aPerson->attentionNumber = attentionNumber; 
     strcpy(aPerson->id, id); 
     strcpy(aPerson->firstName, firstName); 
     strcpy(aPerson->lastName, lastName); 
     aPerson->age = age; 
     strcpy(aPerson->sex, sex); 
    } 
    else 
    { 
     printf("Couldn't insert data\n"); 
     exit(0); 
    } 
}  

/* first node of Queue */ 
Node *headNode(Queue *c) 
{ 
    return c->head; 
} 

/* last node of Queue */ 
Node *tailNode(Queue *c) 
{ 
    return c->tail; 
} 

/* returns true if Queue is empty, false otherwise */ 
bool emptyQueue(Queue *c) 
{ 
    return (c->head == NULL) ? true : false; 
} 

void read() 
{ 

    Queue * C; 
    C = createQueue(); 

    /* Files to read and write, respectively */ 
    FILE *input; 
    FILE *output; 

    /* String to be read */ 
    char data[201]; 

    /* Temp auxiliar Person */ 
    Person tempPerson; 

    /* Tokenize */ 
    char * token; 

    /* Open input file */ 
    input = fopen("input.txt" , "r"); 

    /* not sure abour this */ 
    if(input == NULL) 
    { 
     printf("Couldn't open file\n"); 
     exit(0); 
    } 

    /* Open output file for test */ 
    output = fopen("output.txt" , "w"); 

    /* Read string */ 
    while(fgets(data, 201, input) != NULL) 
    { 

     /* Tokenize by "\t" (tab) */ 
     token = strtok(data,"\t"); 

     /* Count */ 
     int count = 0; 
     while (token != NULL) 
     { 
      if(count == 0) 
      { 
       tempPerson.attentionNumber = atoi(token); 
      } 

      if(count == 1) 
      { 
       strcpy(tempPerson.id, token); 
      } 

      if(count == 2) 
      { 
       strcpy(tempPerson.firstName, token); 
      } 
      if(count == 3) 
      { 
       strcpy(tempPerson.lastName, token); 
      } 
      if(count == 4) 
      { 
       tempPerson.age = atoi(token); 
      } 
      if(count == 5) 
      { 
       strcpy(tempPerson.sex, token); 
      } 
      count++; 
      token = strtok(NULL, "\t"); 
     } 

     /* Call insert function */ 
     insert(tempPerson, tempPerson.attentionNumber, tempPerson.id, tempPerson.firstName, tempPerson.lastName, tempPerson.age, tempPerson.sex); 

     /* Write output file for test */ 
     fprintf(output, " %i ", tempPerson.attentionNumber); 
     fprintf(output, "%s ", tempPerson.id); 
     fprintf(output, "%s ", tempPerson.firstName); 
     fprintf(output, "%s ", tempPerson.lastName); 
     fprintf(output, "%i ", tempPerson.age); 
     fprintf(output, "%s", tempPerson.sex); 

    } 

    /* Close files */  
    fclose(input);  
    fclose(output); 
} 

int main (int argc , char ** argv) 
{ 
    /* Call read function */ 
    read(); 

    return 0; 

} 

錯誤我越來越:

In function ‘read’: 
error: incompatible type for argument 1 of ‘insert’ 
    insert(tempPerson, tempPerson.attentionNumber, tempPerson.id, tempPerson.firstName, tempPerson.lastName, tempPerson.age, tempPerson.sex); 
^
note: expected ‘struct Person *’ but argument is of type ‘Person’ 
void insert(Person *aPerson, int attentionNumber, char id [30], char firstName [40], char lastName[40], int age, char sex[20]) 

我在做什麼錯誤/沒有做?

+0

標準警告:不要投'無效*'/從指針(malloc之類的'()的結果'和朋友)。使用'strcpy'而不需要使用,它會顯示_undefined behaviour_,如果源不適合目的地 - 帳戶的額外終結者。 – Olaf

+0

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – Olaf

+0

這不是教程網站,也不是「寫我的代碼」。有數以千計的實施列表。即使在SO上。 – Olaf

回答

0

好了,所以代替:

insert(tempPerson, tempPerson.attentionNumber, tempPerson.id, tempPerson.firstName, tempPerson.lastName, tempPerson.age, tempPerson.sex); 

它應該是:

insert(&tempPerson, tempPerson.attentionNumber, tempPerson.id, tempPerson.firstName, tempPerson.lastName, tempPerson.age, tempPerson.sex); 
相關問題