如何从文本文件中读取二进制数据并将其存储在C

时间:2016-10-13 14:50:58

标签: c arrays scanf

我有一个看起来像这样的文本文件(H.txt):

1 0 1 1 0 1
0 0 1 1 0 0
0 0 0 1 0 0
1 1 1 0 0 0

我需要将这个文本文件读入一个名为H的2D数组中。文本文件的大小可以在长度和宽度上改变(即,可以有比上面的示例更多的行和更多列的二进制数据)

到目前为止我所拥有的:

#import <stdio.h>

int main()
{

    int m = 4;
    int n = 6;
    int H[m][n];

    FILE *ptr_file;
    char buf[1000];

    ptr_file = fopen("H.txt", "r");
    if (!ptr_file)
        return 1;

    fscanf(ptr_file,"%d",H);

    fclose(ptr_file);
    return 0;
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

像这样

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

int getRows(FILE *fp){
    int ch, rows = 0, notTop = 0;
    while((ch = getc(fp))!= EOF){
        if(ch == '\n'){
            ++rows;
            notTop = 0;
        } else
            notTop = 1;
    }
    if(notTop)
        ++rows;
    rewind(fp);
    return rows;
}

int getCols(FILE *fp){
    int ch, cols = 0, preSpace = 1;
    while((ch = getc(fp))!= EOF && ch != '\n'){
        if(isspace(ch)){
            preSpace = 1;
        } else {
            if(preSpace)
                ++cols;
            preSpace = 0;
        }
    }
    rewind(fp);
    return cols;
}

int main(void){
    int rows, cols;
    FILE *fp = fopen("H.txt", "r");
    if (!fp){
        perror("can't open H.txt\n");
        return EXIT_FAILURE;
    }
    rows = getRows(fp);
    cols = getCols(fp);
    int (*H)[cols] = malloc(sizeof(int[rows][cols]));
    if(!H){
        perror("fail malloc\n");
        exit(EXIT_FAILURE);
    }
    for(int r = 0; r < rows; ++r){
        for(int c = 0; c < cols; ++c){
            if(EOF==fscanf(fp, "%d", &H[r][c])){
                fprintf(stderr, "The data is insufficient.\n");
                free(H);
                exit(EXIT_FAILURE);
            }
        }
    }
    fclose(fp);
    //test print
    for(int r = 0; r < rows; ++r){
        for(int c = 0; c < cols; ++c){
            printf("%d ", H[r][c]);
        }
        puts("");
    }

    free(H);
    return 0;
}

答案 1 :(得分:0)

有很多方法可以解决您的问题。一种非常简单的方法是有两个循环,一个嵌套在另一个循环中。线条的外部和列的内部。在内部循环中,您读取一个数字并存储到矩阵的正确位置。