2013-04-01 29 views
0

我有一個文本文件,如下所示:讀一個.txt文件到2 d陣列

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 

我想讀成整數的2-d陣列。問題是該文件沒有提供關於二維數據維度的信息。我試圖做到這一點如下:

FILE *input_file = fopen(argv[1], "r"); 
while (! feof(input_file)) { 
    read = fscanf(input_file, "%d%c", &x, &del); 
    if (read != 2) { 
     i--; 
     break; 
    } 
    in_data[i][j] = x; 
    if (del == '\n') { 
     i++; 
     j =0; 
     continue; 
    } 
    j++; 
} 

如果行中最後一個數據項之後的字符是換行符,但是否則失敗,此代碼工作正常。在不知道數據維數的情況下,從文件中讀取二維數據的可靠方法是什麼?

+0

可能是重複的如何輸入數據文件分割成一個二維數組(http://stackoverflow.com/questions/8246447/how-to-input-a-data-file-into的-a-2d-array?rq = 1) – user2181624

+0

1.製作文件的'mmap',2.掃描換行符(一維)和換行符之間的空格(第二個維度)。 3.分配內存。 4.讀取數據。 –

回答

1

一個簡單的方法是使用fgets一次讀取一行。然後您可以使用strtol來讀取數值。利用它設置的指針endptr,以便讀取下一個值。

另外,您也可以通過一次讀取一個字符來製作一個簡短的函數來吃掉空白。你可以在那裏處理換行符。閱讀直到遇到非空白字符,然後使用ungetc將該字符放回流中。事情是這樣的:

// Returns false if EOF or error encountered. 
int eat_whitespace(FILE *fp, int *bNewLineEncountered) 
{ 
    int c; 
    *bNewLineEncountered = 0; 

    while(EOF != (c = fgetc(fp))) { 
     if(c == '\n') { 
      *bNewLineEncountered = 1; 
     } else if(!isspace(c)) { 
      ungetc(c, fp); 
      break; 
     } 
    } 

    return (c != EOF); 
} 
+0

我會盡力,謝謝。 – Dronacharya

+0

sscanf的問題在於,它不會跟蹤接下​​來要讀取的字符的位置,就像fscanf一樣。 – Dronacharya

+0

好點 - 它本身並不是一個完整的解決方案。你可以使用'strtok'來標記字符串。然後在每個標記上使用'strtol'而不是'sscanf'。哦,實際上你不需要'strtok' =)因爲'strtol'可以在解析一個值之後返回一個指向字符串其餘部分的指針。 – paddy