2013-10-16 148 views
0

這是我想做的事:試圖將文本文件數據讀入結構數組中?

  • 閱讀我的2個文本文件到「結構的數組」(這是它如何措辭上我的任務)。

    typedef struct { 
        int eventid; 
        char eventdate[20]; 
        char venuename[20]; 
        char country[20];    
        int rockid; 
    } Venue; 
    

    在我的主要功能我有陣列設置接收:

  • 動態地從文件

這裏是我一起工作的結構的一個讀取每個條目提供充足的內存文本爲:

Venue *(places[20]); 

現在出現更復雜的部分。我需要打開文件進行閱讀(我完全理解了這一點),然後爲每個條目動態分配內存。我知道我需要使用malloc來做到這一點,但我從來沒有使用過它,有點不知所措。這是我到目前爲止:

void load_data(void) 
{ 
char buffer[20]; //stating that each line can't be longer than 20 chars 
int i = 0,len; //declaring 2 int variables 

FILE * venuePtr=fopen("venueinfo.txt", "r"); 
if (venuePtr != NULL) 
    printf("\n**Venue info file has been opened!**\n"); 

else{ 
    printf("\nPlease create a file named venueinfo.txt and restart!\n"); 
    } //so far so good... 

    while (!feof(venuePtr)){ //while we have not found the eof key... 
    fscanf(venuePtr,"%s",buffer); //we scan each line of text 
    len = strlen(buffer); //find the length (len) of the string 
    places[i]=(char*)malloc(len+1); //allocate memory space for the word here 
    strcpy(places[i],buffer); //copy a word into our array 
    ++i; //finally we move on to the next element in the array 
} //end while 

問題存在於while循環,我一直在這工作了2天直。我有5個成員在我的結構中,我認爲strcpy可能無法正常工作。儘管我確信這只是問題的一部分。我無法將所有東西都包在頭上。該文件本身是一個超級簡單的txt文件,如下所示:

1 Jan10 Citadel Belgium 8 
4 May05 Sunrise Belize 6 
3 Jun17 Footloose Brazil 4 
+0

如果你會說出你期望發生的事情,以及你不想要發生的事情,這將有所幫助。 – qaphla

+0

您需要考慮的事項是:數據如何存儲在您的文件中?它是在分隔的領域?數據的格式是什麼?確定之後,您需要考慮使用strtok的sscanf來解析數據,並將其複製到您的結構字段中。 – Baldrick

+0

更新了我的文章。謝謝。 – user2884601

回答

0

您試圖將字符串複製到場地結構中,您如何期望該功能起作用? strcpy(場地[我],緩衝區);

請給你的文件的一個例子,你可能需要解析每個元素並將它寫入結構體成員

+0

更新了我的文章。謝謝。 – user2884601

+0

再次,你正在做同樣的事情,你可以打印緩衝區後閱讀,我猜你想要填充結構的權利,因爲你不能只是strcpy ....你需要解析這個緩衝區字符串,並獲得單個值的結構和分配....請嘗試重新考慮這一點,我不會在這裏寫代碼,但如果你嘗試我可以糾正你 –

0

的東西,你可以跳過,但最終應做到:

使用功能(無效),不只是empty()函數。視覺工作室,你正在使用允許它,但它的格式不好。

聲明全局變量同樣是不好的形式。你想在main中聲明它們並將它們傳入。

最後,你想返回。從主成功運行返回0。如果你有一個void函數,仍然返回;在函數的最後關閉'}'字符之前。

哦和fscan_s是不可移植的,這是一個微軟的功能。

的東西,你居然問:現在

,到你的問題。不要分配內存並分配它。你已經爲你的結構靜態分配了內存,併爲你的字符串分配了給定數量的字符。如果你想靜態分配內存,你需要使用一個指針。

如果掃描的第一個數字,岩石ID爲ID,那麼您可以指定第一地點的岩石id作爲,

會場[0]。rockid = id;

對於數組,您必須進行字符串複製。你已經爲它們分配了內存,所以你只需要使用strcpy。

但是你不能只是將字符串複製到結構中,並將它們都放在正確的位置。你需要得到每個部分並單獨添加它

這意味着你需要分別讀取每個元素,比如「%d%s」來讀取一個int然後是一個字符串,或者其他什麼,或者你需要分離你的字符串在閱讀完整個東西之後。 注意 這%s不會閱讀整個行!它會停止在第一個空格字符(新行,標籤,甚至是空格),所以如果你%s「你好」,你會得到「嗨」。您可能希望使用%[^ \ n],而字符不匹配\ n。

我的建議是將fscanf與多個項目一起使用,但是如果您需要將字符串分開,則需要使用sscanf,它允許您再次掃描一個字符串。

最後,你不需要測試feof,這實際上是有問題的。使用while(fscanf(參數進入)> 0)會更好,因爲EOF通常是-1,0表示沒有項目被掃描。無論哪種方式,你都讀完了。

我建議你從小開始。看起來你試圖在不理解基礎知識的情況下跳躍前進,C對於需要了解這些基礎知識有些殘酷。

祝你好運。

P.S.我很可能在這裏寫了一個小錯誤,寫這個,因爲我不是C專家,但我確信有人會來幫助我。發現錯誤是我們學習的方式,所以不要灰心。 :)

+0

更新我的文章。謝謝。 – user2884601

+0

很酷。如果某個人在這裏幫助了您,您可能想要加註他們或點擊複選標記以接受他們的答案。這有助於有類似問題的未來人士。在編輯之前加入舊代碼也很好,這樣他們就可以看到問題了。 – lsiebert

+0

試圖upvote你,但沒有代表尚= = / – user2884601