2013-10-15 50 views
0

當fscanf函數被調用時,我的程序掛起。我不知道爲什麼。我想從以下文本文件中讀取信息:將文本文件讀入結構並拆分它

 R1 N001 N003 20 
    R2 N002 N001 5 
    R3 N001 0 10 
    R4 N002 N003 10 
    R5 N003 N000 5 
    I1 0 N002 10 

這裏是我的結構:

#include<stdlib.h> 
    #include<stdio.h> 
    #ifndef MYDATA_H_ 
    #define MYDATA_H_ 

    typedef struct comp{ 
     char *name; 
     char *node1; 
     char *node2; 
     float val; 
    } ComponentType; 

    typedef struct ListNodeT{ 
     ComponentType Component; 
     float currnet; 
     float voltage; 
     float power; 
    } ListNodeType; 

    #endif 

這是我的函數讀取文本文件和填充我COMPONENTTYPE的結構。

void ReadFile (ComponentType *CircuitData, int *numEl, int *numNodes){ 
*numEl = 0; 
*numNodes = 0; 
int index= 0; 
FILE *myFile = fopen("mydata.dat", "r"); 


if (myFile == NULL){ 
    printf("Error: File the file is not open"); 
} 
printf("This worked\n"); //gets to this point 

while (!feof(myFile)){ 
fscanf(myFile,"%cf",CircuitData[index].name, 
    CircuitData[index].node1,CircuitData[index].node2, 
    &CircuitData[index].val); 
printf("\nfscanf works"); 
*CircuitData[index].node1 = intFromString(CircuitData[index].node1); 
*CircuitData[index].node2 = intFromString(CircuitData[index].node2); 


    if ((int)CircuitData[index].node1 > *numNodes){ 
     *numNodes = (int)CircuitData[index].node1; 
    } 

    if ((int)CircuitData[index].node2 > *numNodes){ 
     *numNodes = (int)CircuitData[index].node2; 
    } 

    (*numEl)+=1; 
    index++; 
} 
fclose(myFile); 
+0

你初始化了你的CircuitData數組嗎? – gaborsch

回答

2

您的代碼中有很多錯誤。

讓我們從fscanf調用開始:您只有格式"%c"可以讀取單個字符,但是您有許多要解析的值。你需要爲每個變量一種格式的代碼,並且需要是正確的(字符串即"%s"):

fscanf(myFile, " %s %s %s %f", 
    CircuitData[index].name, 
    CircuitData[index].node1, 
    CircuitData[index].node2, 
    &CircuitData[index].val); 

注意前導空格,它告訴fscanf跳過前導空格輸入,這是必須的,因爲換行符仍然會在前一行的輸入緩衝區中。

然後繼續讓可能導致上述代碼崩潰的原因:您必須爲字符串分配內存!動態分配(例如CircuitData[index].name = malloc(SOME_SIZE))或將其聲明爲數組(例如char name[SOME_SIZE])。

而當您使用node1node2字段時,這些字段實際上應該是整數字段(例如int node1)。然後,您需要使用fscanf讀取的字符串的幾個臨時變量。而且有標準庫將字符串轉換爲整數,如strtol功能:

CircuitData[index].node1 = strtol(temp_node1, NULL, 10); 

你也有你的閱讀循環的問題,並應如

while (fscanf(...) == 4) { ... } 

和當然,我假設你已經分配的內存爲CircuitData陣列?

您現在確實有很多其他指針相關的錯誤,但是如果您將node1node2更改爲整數,其中一些將被解決。