[英]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.