2014-05-08 76 views
3

我試圖讀取具有以下格式的.txt,以便創建一個大小爲26的數組(每個字母爲1)。在字母數字字符串中存儲整數值

a 5 
b 2 
c 4 
d 10 
e 11 
f 5 
g 7 
... 

我試圖下面與(非工作)執行此操作代碼,發送空VEC [26]作爲一個參數,以及其中包含在每個字的值中的.txt:

void readvalues(FILE*values, int*vec) 
{ 
    if (values == NULL) 
    { 
     printf("Couldn't open values' file\n"); 
     exit(0); 
    } 

    int i=0; 

    while (i<26) 
    { 
     fscanf(values,"%d",&vec[i]); 
     printf("%d\n",vec[i]); 
     i++; 
    } 
} 

當我檢查printf輸出時,我發現vec [0]是正確的,但是此函數開始在其餘位置存儲垃圾。 這是什麼原因造成的?我該如何解決?除fgets之外,還有其他fscanf的選擇嗎?

預先感謝您。

+0

@Jose你需要檢查'fscanf'返回你所期望的匹配數量。在你現在的代碼中,'1',在R Sahu的答案中,'2'。這就是爲什麼你看到*垃圾* - 因爲'fscanf'沒有存儲*任何*那裏。 –

回答

1

這會幫助你:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void readvalues(FILE *values); 

FILE *datafile; 
int vec[26]; 

int main() 
{ 

    datafile = fopen ("my.txt", "r"); 
    readvalues(datafile); 


    return 0; 
} 

void readvalues(FILE *values) 
{ 
    char tmp[2]; 
    if (values == NULL) 
    { 
     printf("Couldn't open values' file\n"); 
     exit(0); 
    } 

    int i=0; 

    while (i<26) 
    { 
     if(fscanf(values,"%s %d",tmp,&vec[i])); 
     printf("%d\n",vec[i]); 
     i++; 
    } 
} 
+0

非常感謝!這解決了它。 – Jose

+1

歡迎您,我認爲您瞭解代碼並且無需詳細說明。 – jahan

1

即使您不打算從文件中使用字母表中的字符,仍需要添加代碼才能讀取字符。否則,嘗試讀取數字將卡在下一封信。

char ch; 

// .... 

fscanf(values,"%c %d", &ch, &vec[i]); 
+0

感謝您的回覆,但是當我添加代碼時,我仍然得到相同的輸出。 – Jose

0

而是用26固定值循環,你可能要考慮循環線,由線到文件中的數據已經一去不復返了:

int getdata(FILE *ifp, int *data){ 
    char buf[256]; // potential size of leading string 
    int i=0;   // offset into data array 

    while (fscanf(ifp, "%s %d", buf, &data[i]) != EOF) { 
     i++; 
    }  
    return i;   // return how many ints were read and processed 
} 

然後你的文件可以有2行或200萬。您只需確保data足夠大 - 可以通過使用動態內存或預先安裝文件中的行來實現。

相關問題