2009-09-06 81 views
0

我有可能包含數字的成千上萬的文本文件(0-9 - >個位數)/字符,如: 13612371029301276312357829031029352131265309182765236728726355263789120938728 ......(這樣下去)如何在C中按字符/數字編號讀取輸入字符?

在C,怎麼辦我將它們讀入一個數組中,以便每個數字都分開存儲? 我的意思是存儲後, array [0] = 1 array [1] = 3 array [2] = 6 ...等[每個數字都是單獨讀取的,這不是一個大數字,而是數字,進入沒有任何形式的空間]

我想你現在明白我的意思......我如何保存它們,如果數字有沒有分隔符?


這裏是一個重新措辭:

我有一個其中有一個非常大的數量的數字文件:〜10^8位不具有任何分隔符:

該文件將看起來像這樣:127389472397413417398410274812371972398748263718238421389410923409234109329413413413241341 ...繼續和繼續

我想逐個閱讀文件 - 數字。我該怎麼做C?

+0

「數字」我認爲你的意思是「數字」。 – 2009-09-06 04:16:26

+0

是的,數字的意思是'數字' – Lazer 2009-09-06 04:20:42

+1

建議使用字符串的人,請說我該如何聲明字符串,如果文件的大小(假設它是已知的)是大約10^8個數字? – Lazer 2009-09-06 04:27:46

回答

2

編輯:輸出數字((char)0到char(9))的數組。

#include <sys/stat.h> 
#include <stdlib.h> 
#include <stdio.h> 

char* read_file_into_array(char* filename, size_t *array_size) 
{ 
    char *array; 
    struct stat st; 
    FILE *f; 
    size_t i; 

    if (stat(filename, &st) != 0) { 
    printf("Error reading %s\n", filename); 
    return NULL; 
    } 
    array = malloc(st.st_size+1); 
    if (!array) { 
    printf("Error allocating memory\n"); 
    return NULL; 
    } 
    f = fopen(filename, "rb"); 
    if (!f) { 
    printf("Error opening file\n"); 
    return NULL; 
    } 
    if (fread(array, 1, st.st_size, f) != st.st_size) { 
    printf("Error reading file\n"); 
    return NULL; 
    } 
    fclose(f); 
    /* Put numeric value into each field */ 
    for(i=0; i<st.st_size; i++) 
    if (array[i] >= '0' && array[i] <= '9') 
     array[i] = array[i]-'0'; 
    else /* end of digits */ 
     break; 

    /* Provide size to caller */ 
    *array_size = i; 

    return array; 
} 
+0

請注意'stat'是不可移植的。我會使用'seek()'和'tell()'來實現可移植性。 – 2009-09-06 04:57:44

+0

不錯。我想他希望數組包含字符讀取的數值,而不是它的ASCII值。 – 2009-09-06 04:58:59

+0

請問你在這裏做了什麼?感謝代碼...但我需要知道你做了什麼!這件事究竟如何運作? – Lazer 2009-09-06 05:03:15

0

只是把它讀作字符串。 C中的字符串基本上是字符數組。

+0

我知道我可以閱讀它作爲一個字符串...但我不可能聲明一個字符串的大小(大小==巨大)。你有什麼建議? malloc的? malloc失敗如果文件是,說〜10^8數字! – Lazer 2009-09-06 04:26:29

+0

您是否需要將所有數據同時存儲在內存中?你可以閱讀一個段並處理它,然後閱讀下一個段..等 – Aziz 2009-09-06 04:42:49

+0

你能解釋你對這個數據做了什麼類型的處理,看看是否有可能把它分成更小的塊 – Aziz 2009-09-06 04:53:03

1

我假設你不希望在這種情況下,我會做這樣的人物,但真正的價值:

  1. 決定您需要讀取多少個數字(如果文件是全部數字,則只是文件的大小)。
  2. 創建尺寸的字符數組。
  3. 讀取文件的內容轉換成char陣列。 for循環來調整所有值加時賽其數值對應
  4. 使用(即做陣列[I] =陣列[Ⅰ] - 在「0」的循環)

享受新的陣列與存儲在所有數字一個數組作爲數值。

+0

文件的大小可能並不總是已知:( – Lazer 2009-09-06 04:22:29

+0

一些統計數據,如果大小是已知的, 我知道我可以讀取它作爲一個字符串。 ..但我不可能聲明大小(尺寸==巨大)。你有什麼建議的字符串?malloc的? 的malloc失敗,如果該文件是,比如說〜10^8號!! – Lazer 2009-09-06 04:25:18

+2

如果你需要它的所有在內存中,那麼你將不得不聲明一個這樣大小的數組,如果它太大而不適合內存,那麼你需要弄清楚如何處理數據塊並按照所述的尺寸將其加載到塊中。 – jerryjvl 2009-09-06 04:38:02

0

如果你想獲得的第一個數字的值,你只是做

INT firstNumber = MyString的[0] - '0';

要獲得第五屆一個你做

INT number5 = MyString的[4] - '0';

2

要一次得到一個字符,看到fgetc。要將很多數字放在一個巨大的整數中,請參閱GMP什麼是它究竟是你想實現?

1

編輯:你是什麼意思,「我用這麼大的輸入是什麼功能?」您用於任何輸入的是相同的。幾個答案給了你一些非常好的功能。 fgetc()讀取字符一在-A-時間從一個文件句柄 - 共同特技成號碼(存儲爲char)轉換成一個數字值是x - '0',其中x是數字字符。 malloc()可以爲你創建一個任意大小的動態分配數組,但當你完成後,你將不得不free()。要獲取文件大小,請在大多數類Unix系統上使用stat(),或者使用fseek()ftell()以查找更便攜的方法。這些都是標準的和相當常見的功能,如果你知道C並知道這些功能,我不知道你的麻煩是什麼。

+0

這次恐怕你的感受不對.. 只是告訴我你用於這麼大的輸入的功能嗎?很公平? a)這不是作業。 b)我從來沒有告訴過你要編寫任何代碼,你告訴我哪個函數不能完全讓我的應用程序工作。 現在,你能幫忙嗎? – Lazer 2009-09-06 05:01:25

0

This後,您可以通過分配的malloc真正的大記憶。

但是,如果該文件是真正巨大的,你不能分配這麼大的內存,你可以簡單地使用File Mapping APIs如果操作系統是Windows。

通過文件映射,您可以將文件映射到內存。之後,你只需要一個指向文件數據的指針(例如char *)。

0

要創建一個大尺寸的字符串,您需要創建一個鏈接列表。鏈接列表是一組結構,其中最後一部分是指向另一個結構的指針。這將允許您存儲更大的字符串,這些字符串將駐留在內存和硬盤驅動器空間中,因此,由於內存問題,您不會用盡空間。

+0

「鏈接列表」(不是「鏈接列表」)是一種可能的解決方案。然而,每個角色有一個節點會有一噸的開銷。也許每個節點可以容納N位數字。但是,鏈表沒有與內存/硬盤空間有關的特殊特徵。簡單地說''malloc()' - 一堆大塊也可能最終使用的虛擬內存大於系統的物理內存。 – 2012-11-05 06:11:02

相關問題