簡體   English   中英

用C將文本文件讀入2D數組

[英]Reading in a text file into a 2D array in C

我有一個文本文件,大小為8 x 12(8行,12列)(x,y)

abcdefghjikl
123456789abc
aerereghjikl
123456789abc
abc43434dfdf
12erere789ab
abcdefghjikl
12345fdfd89a

我正在嘗試將每個字符讀入2d數組,其中第一個維度是行,第二個維度是列。

這是我嘗試過的:

int main(void) {
    FILE * fp;
    fp = fopen("test.txt","r");

    char points[8][12];
    int i,j;

    for(i=0; i<8; i++) {
        for(j=0; j<12; j++) {
            fscanf(fp,"%c",&points[i][j]);
        }
    }

    for(i=0; i<8; i++) {
        for(j=0; j<12; j++) {
            printf("%c",points[i][j]);
        }
    }

    return 0;
}

但是,我的輸出似乎正常工作,直到文件的最后一行。

abcdefghjikl
123456789abc
aerereghjikl
123456789abc
abc43434dfdf
12erere789ab
abcdefghjikl
12345

最后一行沒有完全起作用的地方。 我嘗試增加行的數組尺寸,使最后一行出現,但將垃圾值添加到我的輸出中。 任何幫助將非常感激。

顧名思義,換行符也是字符。 您應該發現輸出保留換行符,這令人懷疑。

實際上,文件的每一行中都有13個字符(假設使用Unix系統)。 十二個可打印的字符和一個換行符。

因此,對於i = 1 ... 7,每個“行”中的第一個字符都是換行符。

幸運的是,可以在等待字符輸入時指示scanf跳過空白字符。 只需在格式說明符字符串的開頭添加一個空格:

fscanf(fp, " %c", &points[i][j]);

注意:您缺少7個字符,這是數組中\\n的數目。

abcdefghjikl \n
123456789abc \n
aerereghjikl \n
123456789abc \n
abc43434dfdf \n 
12erere789ab \n 
abcdefghjikl \n
12345

每行末尾都有一個\\n 這對您不可見,但存儲在數組中。

您可以通過告訴文件指針位置跳過1個字符來簡單地跳過它。

for(i=0; i<8; i++) {
    for(j=0; j<12; j++) {
        fscanf(fp,"%c",&points[i][j]);
    }
    fseek( fp, 1, SEEK_CUR );
}

輸出:

abcdefghjikl
123456789ab
aerereghjik
123456789ab
abc43434dfd
12erere789a
abcdefghjik
12345fdfd89

您應該檢查fp返回指針,以確保文件已正確打開。 這樣的事情是您需要做的:

FILE * fp;
fp = fopen("test.txt","r");
if (fp == NULL) {
    /* handle exit */

至於關於文件最后一行的錯誤,則需要更改此段:

for(i=0; i<8; i++) {
    for(j=0; j<12; j++) {
        fscanf(fp,"%c",&points[i][j]);
    }
}

至:

for(i=0; i<8; i++) {
    for(j=0; j<12; j++) {
        if (fscanf(fp,"%c ",&points[i][j]) != 1) {
            fprintf(stderr, "Non character found.\n");
            return 1;
        }
    }
    printf("\n");
}

跳過fscanf()任何數量的尾隨空白。 fscanf()將在輸入緩沖區中保留換行符,並在下一個fscanf()調用中繼續執行。 檢查已讀取1字符也很安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM