c - 为什么此c编程给出需要的结果?

标签 c

我创建了一个文件B12,其中包含一些字符,我想将该文件存储在2d数组中,然后打印它,但是我的代码没有给我正确的输出。

我使用此代码尝试了它,但它无济于事

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

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

                 fscanf(fp," %c",&ar[i][j]);
           }
     }
        for(i=0; i<9; i++)
     {
            for(j=0; j<8; j++)
        {
                 printf("%c",ar[i][j]);
        }
            printf("\n");
      }



      return 0;
     }


上面代码的输出是,

applemas
obnanaoa
qamalikg
rlpoppqf
elpaaprv
langolne
oagtqamv
okgqplpm
cwfaalpa


但是文件包含以下我需要打印的字符,

applemasgo
bnanaoatqa 
malikgqrlp
oppqfaelpa
aprvelango
lnenoagtqa 
mvlokgqplp
mpcwfaalpa
ghbnnmlspq
oppomobile

最佳答案

目前尚不清楚您想要什么,但是如果要读取,存储和打印不同大小的文件,则使用可变长度数组是一种选择。
读取文件以计算行数和最大列数。
声明可变长度数组。如果存在具有不同列的行,请初始化数组。
倒带文件并将字符存储在数组中。

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

int main ( void) {
    int row = 0;
    int col = 0;
    int line = 0;
    int each = 0;
    int ch = 0;
    FILE *fp = NULL;;

    fp = fopen ( "B12.txt", "r");
    if ( fp == NULL) {
        fprintf ( stderr, "File not Found\n");
        return 0;
    }

    while ( EOF != ( ch = fgetc ( fp))) {//read a character into ch
        if ( '\n' == ch) {//found a newline
            row++;//count rows
            each = 0;
            continue;
        }
        each++;//count characters
        if ( each > col) {
            col = each;//store maximum col
        }
    }

    rewind ( fp);//go back to start of file

    char arr[row][col];//variable length array

    for ( line = 0; line < row; ++line) {
        for ( each = 0; each < col; ++each) {
            arr[line][each] = 0;//set all to 0
        }
    }

    line = 0;
    each = 0;

    while ( EOF != ( ch = fgetc ( fp))) {//read a character into ch
        if ( '\n' == ch) {//found a newline
            line++;//next line
            each = 0;//first character
            continue;//do not store the newline
        }
        arr[line][each] = ch;//save ch into arr
        each++;//next character
    }

    fclose ( fp);

    for ( line = 0; line < row; ++line) {
        for ( each = 0; each < col; ++each) {
            if ( arr[line][each]) {//not 0
                fputc ( arr[line][each], stdout);
            }
        }
        fputc ( '\n', stdout);
    }

    return 0;
}


另一种选择是使用malloc分配内存,而不是使用可变长度数组。这还将允许在仅读取文件一次的同时进行读取和分配。它可能会允许处理更大的文件。

关于c - 为什么此c编程给出需要的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56414464/

相关文章:

c - 为 Matlab 编译 C MEX 文件时 size_t 和 mwSize 之间的区别

c - 向文件服务器发送系统调用

c - c中绝对值的写法

c - 与 epoll : error handling 联网

c - 以编程方式从C中的dd图像中提取文件

c++ - 为什么在遗留 strcpy() 中没有健全性检查

c - 如何严格执行一个定义?

c - 释放空指针

c - 我需要一个用于定点数学库的快速 96 位对 64 位特定除法算法

c - 在c中使用winsock进行socket编程