我试图编写一个可以将文本文件内容逐行复制到矩阵的函数,所以这就是我想出的:
"Stopping due to fatal error: NullReferenceException: Object reference not set to an instance of an object"
我试图在Windows和Linux上编译并运行它,但是它唯一要做的就是给我几乎没有用的错误,例如:
"Segmentation fault (core dumped)"
或
requests
答案 0 :(得分:0)
您必须为none
的每个元素分配内存。这与写作完全相同:
matrix
作为程序的第一步,遍历char *s = "string";
,并为每个单元格调用matrix
:
malloc
注意:我们检查int i;
for (i = 0; i < 5; ++i)
if (!(matrix[i] = malloc(MAXLEN))) [
perror("malloc");
exit(EXIT_FAILURE);
}
的返回值以确保没有发生错误。
答案 1 :(得分:0)
使用您的代码,我认为文件中的矩阵将受到限制(您定义的行数为5,列数为12)。因此,我再次考虑编写可以灵活的代码,无需再次设置最大行数或列数。我们去了
#include <stdio.h>
#include <stdlib.h> //malloc realloc
//file read function. returning string with splitted new line
//ex: (note: newline is '\n' (ENTER))
//test.txt:
//10 20 30(space)(newline)
//40 50 60(space)(newline)
void file_to_matrix(char *filename)
{
FILE * file = fopen(filename, "r");
char *buff = (char*)malloc(sizeof(char)); //temp string
int *matrix_row = (int*)malloc(sizeof(int)); //temp matrix row
int **MATRIX = (int**)malloc(sizeof(int*)); //this will become the final matrix
int index_buff = 0, index_MATRIX = 0, index_matrix_row = 0;
while (1)
{
char c = getc(file);
if (c==EOF)
{
break;
}
if (c=='\n') //if c meet newline, then add the matrix row to final matrix
{
(*(MATRIX+index_MATRIX)) = matrix_row;
index_MATRIX++;
MATRIX = realloc(MATRIX, sizeof(MATRIX)*(index_MATRIX+1));
matrix_row = (int*)malloc(sizeof(int));
index_matrix_row = 0;
printf("\n");
continue;
}
if (c==' ') //if c meet space, then buff wil converted to int
{
int num = atoi(buff);
printf("%d ", num);
(*(matrix_row+index_matrix_row)) = num;
index_matrix_row++;
matrix_row = realloc(matrix_row, sizeof(int)*(index_matrix_row+1));
free(buff);
buff = (char*)malloc(sizeof(char));
index_buff=0;
continue;
}
//add buff with c
(*(buff+index_buff))=c;
index_buff++;
buff = realloc(buff, sizeof(char)*(index_buff+1));
}
fclose(file);
//clearing the dynamic memory
free(buff);
for (int i = 0; i < index_MATRIX; i++)
{
free(MATRIX[i]);
}
}
int main()
{
file_to_matrix("test.txt");
return 0;
}
test.txt:
10 20 30
40 50 60
70 80 90
如果您对test.txt格式感到困惑,我将再次说明:
10 20 30(space)(newline)
30 40 60(space)(newline)
70 80 90(space)(newline)
答案 2 :(得分:0)
谢谢您的答复,我认为您的解决方案非常聪明,但我一直在寻找更简单的解决方案。
经过一番尝试和错误后,我认为我找到了一个解决方案,该解决方案不是很通用,但它很简单,而且似乎可以正常工作:
#include <stdlib.h>
#include <stdio.h>
#define ROWS <n of rows>
#define COLS <n of columns>
void file_to_matrix(int rows, int cols, char matrix[rows][cols], char file_path[]){
FILE *file = fopen(file_path, "r");
if(file==NULL){
printf("File error");
exit(1);
}
int y=0;
for(int x=0; (matrix[y][x]=getc(file))!=EOF; ++x){
if(matrix[y][x]=='\n'){
matrix[y][x]='\0';
++y;
x=-1;
}
}
fclose(file);
}
int main(){
char matrix[ROWS][COLS+2];
file_to_matrix(ROWS, COLS+2, matrix, "file path");
for(int i=0; i<=ROWS; ++i){
printf("%s\n", matrix[i]);
}
}
再次感谢您的回答