从 C 中的文件输入创建二维数组

Posted

技术标签:

【中文标题】从 C 中的文件输入创建二维数组【英文标题】:Creating a two dimensional array from a file input in C 【发布时间】:2012-11-07 03:31:32 【问题描述】:

TL;DR:在二维数组中苦苦挣扎。

我正在尝试从文本文件中的整数列表创建两个二维数组。这是用 C 编写的。

tester.txt 包含:

2 1 2 3 4 5 6 7 8 

第一个数字表示两个数组都有 2 行和 2 列,如果是任何其他数字,列/行将被表示为这样。

tester.txt 应该输出以下内容:

1 2    5 6
3 4    7 8

这是我的代码:

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

int main()

    int i,j,k;
    FILE *filepointer;
    int nrows;
    int size;

    fputs("Enter a filename: ", stdout);
    fflush(stdout);

    if ( fgets(filename, sizeof filename, stdin) != NULL )
    
        char *newline = strchr(filename, '\n'); /* search for newline character */
        if ( newline != NULL )
        
            *newline = '\0'; /* overwrite trailing newline */
        
        printf("filename = \"%s\"\n", filename);
    

    filepointer=fopen(filename,"r");
    fseek(filepointer, 0, SEEK_END); // seek to end of file
    size = ftell(filepointer);
    printf("Size=%d\n",size);
    fseek(filepointer, 0, SEEK_SET);

    int holderarray[size];

    for(i=0; i<size; i++)
        fscanf(filepointer, "%d", &holderarray[i]);

    nrows=holderarray[0];
    printf("Number of rows/columns=%d\n",nrows);

    if (filepointer == NULL)
    
        fprintf(stderr, "Can't open input file in.list!\n");
        exit(1);
    

到目前为止,一切都按预期进行。我无法想象如何将前半部分的值添加到新的二维数组中,希望你们能提供帮助。这是我在代码块中的头脑风暴。

int matrix1[nrows][nrows];
int matrix2[nrows][nrows];


for (i=1; i<sizeof(holderarray);i++)

    for (j=0;j<nrows;j++)
    
        matrix[i][j]=holderarray[j];
    

for (i=0;i<sizeof(nrows);i++)

    for (j=0;j<sizeof(nrows);j++)
    
        printf("%d",matrix[i][j]);
    


return 0;

【问题讨论】:

您的 holder-array 正在调整为文件的字节数;不是其中的整数个数。如果这是有意作为确保您不会超出短数组的机制,那似乎有点矫枉过正。 哦,我不知道,如何按整数个数调整大小? 你没有。这是一个txt文件。您需要处理其中的字符数据,转换为您需要的本机数据类型(在您的情况下,ints)。在读取数字字符后创造性地使用scanf()(并转换为您的int 矩阵大小,当然),这将是一个相当直接的解决方案。 【参考方案1】:

您可以通过使用 getc 循环获取它们

1. you read the first char in line and define the array structure , cast to integer 
2. initialize the arrays  eg you read 2 so 2*2 is the size of the array, 3*3 is the size of the array and number of the elements to read in every array 
3. continue reading in to reach the first array bound based 2*2 = 4 3*3= 9 based on the first line. 

4. fill the other array since the first array is full,

【讨论】:

是的,我明白这将如何运作。这不是三个嵌套循环。我正在尝试将其可视化,但我遇到了困难/【参考方案2】:

您不能像这样基于编译时未知的变量在标准 C 中动态声明数组:

int matrix1[nrows][nrows];
int matrix2[nrows][nrows];

如果您不使用 C99 或更高版本,您需要做的是使用为您动态分配内存的 malloc 函数:

int **matrix1, **matrix2;
int i;

matrix1 = malloc(nrows * sizeof(int*));
matrix2 = malloc(nrows * sizeof(int*));

for(i = 0; i < nrows; i++) 
  matrix1[i] = malloc(nrows * sizeof(int));
  matrix2[i] = malloc(nrows * sizeof(int));

C 中的二维数组被视为指向指针的指针。每个指针都是对包含整数的连续内存块的引用(即矩阵的行),然后我们使用指向指针的指针作为对包含指向第一个元素的引用/指针的另一个连续内存块的引用在所有这些行中。

这张图片(不是我的)可能有帮助:DYNAMIC 2D ARRAY

请注意,当您使用完动态分配的内存时,应该释放它:

for(int i = 0; i < nrows; i++) 
  free(matrix1[i]);
  free(matrix2[i]);


free(matrix1);
free(matrix2);

【讨论】:

是的,我明白了,但是当我们到达 int matrix1[nrows][nrows] 时,nrows 被实例化了。 这仅在您使用 C99 时有效,因此请确保在编译时具有 -std=c99 标志。抱歉不清楚;我将编辑我的答案。

以上是关于从 C 中的文件输入创建二维数组的主要内容,如果未能解决你的问题,请参考以下文章

如何创建二维数组

C ++根据用户输入字符串长度创建二维数组

c语言中怎样输入一个3*3的二维数组存储到文件中在文件中按顺序输出二维数组

JNI维数组:将二维数组从java传递给c

c语言二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

c语言如何表示二维数组里面有#