我正在尝试将.txt文件中的2D矩阵读入动态大小的2D数组中。 .txt文件中的矩阵以制表符分隔,可以是任何大小,但为简单起见,我们有:
1 2 3
4 5 6
7 8 9
我解析文件的行数和列数,使用**dynamicMatrix
动态创建一个空的2D数组malloc()
并尝试用我文件中的数据填充所述数组。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
/* File Names for IO */
#define MATRIX2 "matrix2.txt"
int rowCounter(FILE *filePtr)
{
int rowCount = 1;
int ch;
while ((ch = fgetc(filePtr)) != EOF)
{
if (ch == '\n')
{
rowCount++;
}
}
rewind(filePtr);
//printf("row count:%d\n", rowCount);
return rowCount;
}
int colCounter(FILE *filePtr)
{
int colCount = 1;
int ch;
while ((ch = fgetc(filePtr)) != '\n')
{
//printf("ch was: %c\n", ch);
if (ch == '\t')
{
colCount++;
}
}
rewind(filePtr);
//printf("col count:%d\n", colCount);
return colCount;
}
int **matrixConstructor(FILE *filePtr)
{
int rowCount = rowCounter(filePtr);
int colCount = colCounter(filePtr);
int **dynamicMatrix;
dynamicMatrix = malloc(rowCount * sizeof(int*));
for (int i = 0; i < rowCount; i++)
{
dynamicMatrix[i] = malloc(colCount * sizeof(int));
}
return dynamicMatrix;
}
void populateMatrixFromFile(FILE *filePtr, int **dynamicMatrix)
{
for (int i = 0; i < rowCounter(filePtr); i++)
{
for (int j = 0; j < colCounter(filePtr); j++)
{
fscanf(filePtr, "%d", &dynamicMatrix[i][j]);
}
}
}
void matrixPrinter(FILE *filePtr, int **dynamicMatrix)
{
for (int j = 0; j<colCounter(filePtr); j++)
{
for (int i = 0; i<rowCounter(filePtr); i++)
{
printf("%d\t", dynamicMatrix[j][i]);
}
printf("\n");
}
}
int main()
{
/* File Pointers and Open Files to Read */
FILE *fpMatrixIN2 = fopen(MATRIX2, "r");
/* Check File Pointers for Null, Exit if Null */
if (fpMatrixIN2 == NULL)
{
printf("One or more files failed to be found. Please make sure they are in the same directory as the executable.\n");
system("pause");
exit(1); //shut down program to avoid crash
}
/* Empty Arrays of Appropriate Lengths to store Matrices from Files */
int **dynamicMatrix2 = matrixConstructor(fpMatrixIN2);
populateMatrixFromFile(fpMatrixIN2, dynamicMatrix2);
matrixPrinter(fpMatrixIN2, dynamicMatrix2);
//system("pause");
return 0;
}
我遇到的问题是fscanf(filePtr, "%d", &dynamicMatrix[i][j])
似乎只是从我的文件中读取第一个int,所以我的3x3 dynamicMatrix填充了1。我不确定为什么会发生这种情况,因为我的理解是fscanf()
应该读入数组的int然后继续读取第二个,第三个等等。
打印**dynamicMatrix
的预期输出:
1 2 3
4 5 6
7 8 9
打印**dynamicMatrix
的实际输出:
1 1 1
1 1 1
1 1 1
我一直在把头发拉过来,所以额外的一双眼睛来帮助找到问题将不胜感激:)
修改
正如提到的@user3386109
和@f igura
一样,问题是我在rowCounter()
的for循环中调用了colCounter()
和populateMatrixFromFile
,它在每次迭代时都会重绕文件指针循环,因此导致fscanf()
每次只读1。我更改了代码以在main中调用rowCounter()
和colCounter()
,然后将其值传递给我的函数。
答案 0 :(得分:1)
所以问题是你的rowCounter和colCounter。更具体地说,你在for循环中调用它们导致你继续倒带,当然你只能打印&#34; 1&#34;。 尝试将rowCount和colCount作为参数传递给populateMatrixFromFile和matrixPrinter。
答案 1 :(得分:0)
rowCounter()
中的代码调用循环中的colCounter()
和rewinds
函数。这不仅浪费了大量时间,而且在循环的每次迭代中它也rowCounter()
。最好在colCounter()
中致电main
和[] :: [a]
(:) :: a -> [a] -> [a]
完全 一次 ,然后将计数传递给其他功能