如何从文件中读取所有字符并将其存储在不带\ n的2d数组中?

时间:2019-05-31 13:21:43

标签: c arrays

我正在尝试读取文件并将其每个字符存储在2d数组(大小为7 x 7)中,而不使用'\ n'等特殊字符,然后打印该2d数组。

我写了一个代码,但是它不存储和打印2d数组中的最后一行字符。

#include<stdio.h>
#include<stdlib.h>
int main()
{
     char ar[7][7],c;
    int i,j;
    FILE *fp;
    fp=fopen("B11.txt","r");
    if(fp==NULL)
        printf("File not Found");


for(i=0; i<7; i++)
    {
        for(j=0; j<7; j++)
        {

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


    }


for(i=0; i<7; i++)
    {
        for(j=0; j<7; j++)
        {
            printf("%c",ar[i][j]);
        }

    }
fclose(fp);
}

这是我的代码的输出:

abtvelo
camerag
bhtollp
qeryvxq
appboyl
awerfgh

但是文件包含

abtvelo
camerag
bhtollp
qeryvxq
appboyl
awerfgh
comsats

此处文件也包含单词'comsats',但未打印。为什么不印出“ comsats”一词?

2 个答案:

答案 0 :(得分:2)

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

ar[i][0]与上一行遗漏的\n总计为7 \n,因此忽略了最后一行。


更改为

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

在内部getchar()循环之后有for

答案 1 :(得分:1)

\n字符导致最后一行被跳过。
更改此:

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

对此:

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

使用scanf()%c %lf %d格式说明符时,空格会占用换行符。但是,读取字符串(%s时不需要空格。

关于您的陈述:没有特殊字符,例如'\ n'
如果这样您指的是以下字符:

  • 空格(“”)
  • 水平标签(“ \ t”)
  • 换页(“ \ f”)
  • 回车(“ \ r”)
  • 垂直标签(“ \ v”)
  • 当然还有换行符(“ \ n”)

考虑结合使用空白测试功能的 fscanf() {{3}用一个替换 fgetc() 构造。 }} 。 (检查上面列出的那些字符。)示例:

#define ROW 7
#define COL 7
int main(void)
{
    int row = 0;
    int col = 0;
    char ar[COL][ROW];
    int byte;

    FILE *fp = fopen(filename, "r");
    if(fp)
    {
        byte = fgetc(fp);
        while(byte != EOF)
        {
            if(!isspace(byte))
            {   //populate array only if not white-space
                ar[col][row++] = (char)byte;
                if(row == ROW) 
                {
                    row = 0;
                    col++;
                }
                if(col == COL) break;
            }
            byte = fgetc(fp);
        }
        fclose(fp);
    }
    // print results as in your original post...    

    return 0;
}