发布网友 发布时间:2022-04-22 00:16
共3个回答
热心网友 时间:2022-04-27 19:12
楼主朋友,你的程序中的问题出在分配空间不足上。比如当你想让a[j]指向某段内存时,用的是
a[j]=(char *)malloc(sizeof(char)); 而到了后面你是要在这段内存中存入一个字符串的,所以就发生了越界。下面是我根据你的代码片段写的一个测试程序,经过修改应该没问题了。
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char path[]="12345.txt";
FILE *create;
if((create=fopen(path,"r"))!=NULL)
{
int j; char **a;
a=(char **)malloc(100*sizeof(char*)); //此处如果只申请一个char *大小的空间时,
//你以后的a[j]往哪里放?此处的100是假设你的文件中有100行信息。如果超过100还得多分配
for (j=0;;j++)
{
a[j]=(char *)malloc(10000*sizeof(char)); //此处只申请一个字符的空间,后面读取
//长度为10000的字符串就没地方存放了
fgets(a[j],10000,create);
printf("%s",a[j]); //测试读取是否成功,将文件中信息显示到屏幕上
if(feof(create)!=0)
{
for(;j=0;j--)
free(a[j]);
break;
}
}
free(a);
}
else
printf("Fail to open the file.\n");
fclose(create);
printf("\n");
}追问原来如此,那如果我并不知道文件的行数,此处只定义100如果越界了怎么办呢?因为要求最后放进去测试的文件数据量会比较大。另外能加个Q不,我是大一C的初学者,期末要写个程序问题比较多,希望您能帮助我一下,可以吗?
追答你可以累计读取的行数,如果超过了100可以用 realloc 重新分配再多增100个。或者超过100后,先把这100行是数据处理完,然后释放掉这100个a[j],接下来再重新为每个a[j]分配一个指向的10000个字节的空间,把后面的字符串存入,依次类推直到文件结束。 在这一过程中不一定要分配100个,你可以根据情况进行选择。
8430486 我的QQ
热心网友 时间:2022-04-27 20:30
1通过fopen函数打开文本,例如FILE *fp=fopen("in.txt","r");//返回一个FILE类型的句柄
2然后就可以通过fcanf()函数对txt文本进行读取
3操作完文本之后用fclose()函数 关闭已经打开的文件。
#include <stdio.h>热心网友 时间:2022-04-27 22:04
文件路径名要有且符合题意(自己手工打造,满意请采纳,不懂可以追问.)追问这个是一个另写的函数,路径名path在主函数里传过来的,没有问题,这个已经测试过了
追答那不清楚,你可以放到贴吧里去问一问。