2012-11-15 92 views
3

我有一個非常簡單的問題。我需要在一個文件中的內容讀入到C中的字符數組的文件將總是被格式化爲信兩列,例如:將格式化文件讀入C中的char數組中

A B 
B C 
E X 
C D 

每個字母表示在圖上一個頂點,其I」稍後會處理。我學習了使用C++和Java編程,但我並不特別熟悉C語言。

是什麼導致我無法弄清楚的問題是文件長度爲多行。我需要每個字母佔用陣列中的一個插槽,因此在這種情況下,它應該是: array[0] = 'A', array[1] = 'B', array[2] = 'B', array[3] = 'C'等等。

最後我需要數組不包含重複項,但我可以稍後處理。我在本學期早些時候編寫了一個程序,它從一個文件的單行中讀取,它工作正常,所以我複製了大部分代碼,但在這種情況下它不起作用。這是我到目前爲止有:

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

int main (int argc, char *argv[]) 
{ 
    int i; 
    int count = 0; 
    char * vertexArray; 
    char ch = '\0'; 

// open file 
    FILE *file = fopen(argv[1], "r"); 

// count number of lines in file 
    while ((ch=fgetc(file)) != EOF) 
     if(ch == '\n') count++; 

// numbers of vertices is twice the number of lines 
    int size = count*2; 

// declare vertex array 
    vertexArray = (char*) calloc(size, sizeof(char)); 

// read in the file to the array 
    for(i=0; i<size; i++) 
     fscanf(file, "%c", &vertexArray[i]); 

// print the array 
    for(i=0; i<size; i++) 
     printf("%c\n", vertexArray[i]); 

    fclose(file); 
} 

我知道我需要被測試的文件打開和被正確和諸如此類的東西看,但我將在後面補充說英寸只是試圖讀入數組。我的輸出在這種情況下是8個空行。任何幫助將是偉大的!

回答

1

當你遍歷文件來計算行數時,文件指針已經坐在EOF,所以你不會讀取任何數據到你的數組中。充其量它會和你最後一個角色的價值一樣,但它可能會向你展示分段錯誤。

你想要做什麼是

rewind(file); 

//read file into the array 

,那麼你會在文件的開頭開始之前。 另外,我不知道fgetc如何處理行尾,因爲坐在那裏通常有一個尾隨的。你可以這樣做的另一種方法是使用fscanf像這樣

i = 0; 
while (!feof(file)){ 
    fscanf(file, "%c %c", &vertexArray[i], &vertexArray[i+1]); 
    i++; 
} 

功能feof(FILE *)檢查是否EOF標誌已經設置,並停止一旦你打EOF

更新:我認爲如果您將ch定義爲int ch,它應該工作。看看this線程。

這是爲我工作的代碼:

int main (int argc, char *argv[]) 
{ 
    int i; 
    int count = 0; 
    char * vertexArray; 
    int ch, size; 

    FILE *file; 
    file = fopen(argv[1], "r"); 

    while ((ch = fgetc(file) != EOF)) 
     count++; 

    size = count*2; 
    vertexArray = (char*) calloc(size, sizeof(char)); 
    rewind(file); 

    for(i=0; i<size; i++) 
     fscanf(file, "%c ", &vertexArray[i]); 

    for(i=0; i<size; i++) 
     fprintf(stderr, "%c\n", vertexArray[i]); 

    fclose(file); 

}

新的編輯通知fscanf(file, "%c ", &vertexArray[i]);後的空間。這告訴C你想在閱讀角色後跳過所有的空格。沒有空間的話,它也會將空白作爲一個字符來讀取。這應該解決它。

+0

你的建議似乎像它應該工作,但是當我嘗試它,我得到一個分段錯誤。它似乎與倒帶(文件)。我也試過fseek(文件,0,SEEK_SET),但同樣的事情。我看不出爲什麼我得到這個。 – DaBurto

+0

對不起,我實際上沒有試過這個來告訴你它是否有效,我應該提到這一點。我會_actually_試一下,讓你知道。 – Kitchi

+0

由於某些原因,它似乎在閱讀額外的行?有了這個代碼我的計數= 20使大小= 40,他們應該分別爲4和8(或9?包括NULL終止?不知道)。 – DaBurto

0

fgetc提前文件位置指示器。您需要用當前代碼回溯到0,或者讀取行而不關心行數。

0

當您開始讀取數據時,您已經用計算行數來耗盡文件。您必須倒帶或重新打開文件。

0

您需要添加fseek(file, 0, SEEK_SET);

您的代碼來看看:

//Some stuff 

// declare vertex array 
vertexArray = (char*) calloc(size, sizeof(char)); 

fseek(file, 0, SEEK_SET); 
// read in the file to the array 
    for(i=0; i<size; i++) 
     fscanf(file, "%c", &vertexArray[i]); 

//Some stuff 
相關問題