2012-07-10 149 views
1

我有這段代碼從文件中讀取整數。 我使用相同的代碼從另一個文件 讀取雙打,並完美地工作,但這次循環是 變得無限。可能是什麼?我正在閱讀的文件 是由程序編寫的,可以嗎?我不知道 這是什麼意思,但我的操作系統說這個文件是 二進制。那麼,任何幫助將不勝感激。謝謝。在C中讀取文件

i=1; 
cadeia = malloc (i * sizeof(int)); 
if (!cadeia){ //Avalia se a alocação de memória foi bem sucedida 
    printf("Problema na alocação de memória para cadeia."); 
    exit(0); 
} 
while (!feof(arq_cadeia)){ /*Fazendo leitura e alocação de memória da matriz de transição*/ 
    fscanf (arq_cadeia , "%d" , (cadeia+i-1)); 
    i++; 
    cadeia = realloc (cadeia , i * sizeof(int)); 
    if (!cadeia){ //Avalia se a alocação de memória foi bem sucedida 
    printf("Problema na alocação de memória para cadeia."); 
    exit(0); 
    } 
    printf("%d\n", *(cadeia+i-1)); 
} 
+1

您需要檢查'fscanf'的結果並確保它等於1. – 2012-07-10 15:38:26

+4

關於'while(!feof(arq_cadeia))',請注意,'feof'只會變爲true _after_您嘗試讀取文件結尾。在循環中,檢查'fscanf'的返回值,如果遇到無效輸入,則保留在流中,並且所有後續掃描都失敗。 – 2012-07-10 15:38:55

+0

這裏與你的問題無關,但你應該考慮以更大的增量分配你的緩衝區,預分配一個塊,如果你需要更多的話,然後在塊中做一個realloc。 – pstrjds 2012-07-10 15:39:13

回答

2

你的預感是正確的,如果你的文件是二進制格式scanf無法讀取它。如果使用文本編輯器(例如記事本)無法看到數字,scanf也無法讀取它們。

順便說一下,你的程序有其他問題:每次讀取數字時,重新分配整個數組效果非常低效!最簡單的事情就是分配太多的空間以至於你不需要所有的空間(不要擔心「浪費」,只要你沒有超越頂端)。第二個最簡單的方法是測量文件的大小(你需要stat或其他的),並估計它的整數。第三種最簡單的方法是,爲10000個整數分配足夠的空間,然後仔細檢查你什麼時候用完,分配的次數是你已有的兩倍。

+0

非常好!非常感謝您的幫助。 – Rodolfo 2012-07-10 16:21:08

0

假設它們是以文本模式編寫的,您正在閱讀整數。如您懷疑的那樣,檢查文件是否是文本文件或是否是二進制文件。如果你可以用文本編輯器打開它並閱讀內容,那麼它是一個文本文件。否則,您需要調整程序以讀取二進制文件。

+0

正如我在評論中所說:所有文件都是二進制文件。訪問模式有什麼變化,而不是文件。 – m0skit0 2012-07-10 15:42:13

+0

不錯,謝謝! – Rodolfo 2012-07-10 16:21:20