逐个字符地从文本文件中读取多行时出现分段错误
Segmentation Fault while reading multiple lines from a text file character-by-character
我正在尝试从文件中读取行,一次一个字符。
输入示例:
5 2
2
1 3
2 4 5
3
假设我正在尝试读取第一行,然后我先读取“5”,然后是 space(“”),然后是“2”,然后尝试存储这两个数字在一个数组中,我使用 realloc
声明它,因为我不知道在读取该行之前一行中会有多少数字。
我只知道文件中将出现的行数 numNodes
.
我正在尝试将数字存储在二维数组中,其中每一行的长度都不同。
由于我事先不知道每行的长度,因此我在读取每个数字后使用 realloc
分配内存。
由于数字可以超过一位,我将字符存储在 num
字符数组中,当我遇到 space(' ') 或换行符('\n' ), 我使用 atoi
将其转换为数字,并在使用 realloc
.
为其分配内存后将其存储在合适的行中
这是我的代码
FILE *fp;
fp = fopen("input.txt","r");
char ch;
int numNodes = 5, i = 0;
int **adjList = (int **)malloc(numNodes*sizeof(int *));
int len = 0,j,k=0;
char num[4];
for(i=0;i<numNodes;i++)
{
adjList[i] = NULL;
printf("Node %d -> ",i+1);
do
{
//read =
fscanf(fp,"%c",&ch);
if(ch!=' ' && ch!='\n')
{
num[k]=ch;
k++;
}
else
{
k = 0;
len++;
adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
adjList[i][len-1] = atoi(num);
for(k=0;k<4;k++)
num[k]='0';
}
}
while(ch!='\n');
for(j=0;j<len;j++)
printf("%d ",adjList[i][j]);
printf("\n");
len = 0;
}
但是,我在最后一行得到 Segmentation Fault (core dumped)
,也就是说,在打印 2 4 5
之后。
感谢任何帮助,为什么最后一行出现此错误?
编辑 :
在 fscanf
行
中将 ch
更改为 &ch
已将 ch[0]
更改为 ch
(if
语句)
在 do...while
循环之前添加 adjlist[i] = NULL
fscanf(fp,"%c",&ch);
if(ch!=' ' && ch!='\n')
{
num[k]=ch;
k++;
}
else
{
k = 0;
len++;
adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
adjList[i][len-1] = atoi(num);
for(k=0;k<4;k++)
num[k]='0';
}
当您读完一个数字后 k
将是 4
。
for(k=0;k<4;k++)
num[k]='0';
然后您开始使用 k >= 4
读取下一个数字,因此超出了 num
的范围。
num[k]=ch;
k++;
您还需要使用 [=19=]
字符终止 num
以与 atoi
一起使用。
num[k] = '[=13=]';
adjList[i][len-1] = atoi(num);
我正在尝试从文件中读取行,一次一个字符。
输入示例:
5 2
2
1 3
2 4 5
3
假设我正在尝试读取第一行,然后我先读取“5”,然后是 space(“”),然后是“2”,然后尝试存储这两个数字在一个数组中,我使用 realloc
声明它,因为我不知道在读取该行之前一行中会有多少数字。
我只知道文件中将出现的行数 numNodes
.
我正在尝试将数字存储在二维数组中,其中每一行的长度都不同。
由于我事先不知道每行的长度,因此我在读取每个数字后使用 realloc
分配内存。
由于数字可以超过一位,我将字符存储在 num
字符数组中,当我遇到 space(' ') 或换行符('\n' ), 我使用 atoi
将其转换为数字,并在使用 realloc
.
这是我的代码
FILE *fp;
fp = fopen("input.txt","r");
char ch;
int numNodes = 5, i = 0;
int **adjList = (int **)malloc(numNodes*sizeof(int *));
int len = 0,j,k=0;
char num[4];
for(i=0;i<numNodes;i++)
{
adjList[i] = NULL;
printf("Node %d -> ",i+1);
do
{
//read =
fscanf(fp,"%c",&ch);
if(ch!=' ' && ch!='\n')
{
num[k]=ch;
k++;
}
else
{
k = 0;
len++;
adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
adjList[i][len-1] = atoi(num);
for(k=0;k<4;k++)
num[k]='0';
}
}
while(ch!='\n');
for(j=0;j<len;j++)
printf("%d ",adjList[i][j]);
printf("\n");
len = 0;
}
但是,我在最后一行得到 Segmentation Fault (core dumped)
,也就是说,在打印 2 4 5
之后。
感谢任何帮助,为什么最后一行出现此错误?
编辑 :
在
fscanf
行 中将 已将
ch[0]
更改为ch
(if
语句)在
do...while
循环之前添加adjlist[i] = NULL
ch
更改为 &ch
fscanf(fp,"%c",&ch);
if(ch!=' ' && ch!='\n')
{
num[k]=ch;
k++;
}
else
{
k = 0;
len++;
adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
adjList[i][len-1] = atoi(num);
for(k=0;k<4;k++)
num[k]='0';
}
当您读完一个数字后 k
将是 4
。
for(k=0;k<4;k++)
num[k]='0';
然后您开始使用 k >= 4
读取下一个数字,因此超出了 num
的范围。
num[k]=ch;
k++;
您还需要使用 [=19=]
字符终止 num
以与 atoi
一起使用。
num[k] = '[=13=]';
adjList[i][len-1] = atoi(num);