C语言中读取txt文件内容

FILE *create; if((create=fopen(path,"r"))!=NULL) { int j; char **a; a=(char **)malloc(sizeof(char*)); for (j=0;;j++) { a[j]=(char *)malloc(sizeof(char)); fgets(a[j],10000,create); if(feof(create)!=0) { for(;j=0;j--) free(a[j]); break; } } free(a); } else printf("Fail to open the file.\n");

txt文件每行字符个数未知。我想把txt里每一行单独存放一个字符串,于是想用动态二维数组,这段代码有什么问题?编译没问题,运行之后就不行了,会死机还怎么的

楼主朋友,你的程序中的问题出在分配空间不足上。比如当你想让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个,你可以根据情况进行选择。
843064486 我的QQ

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-09-13

1通过fopen函数打开文本,例如FILE *fp=fopen("in.txt","r");//返回一个FILE类型的句柄

2然后就可以通过fcanf()函数对txt文本进行读取

3操作完文本之后用fclose()函数 关闭已经打开的文件。

#include <stdio.h>
int main()
{
 int data;
 FILE *fp=fopen("in.txt","r");
 if(!fp)
 {
  printf("can't open file\n");
  return -1;
 }
 while(!feof(fp))
 {
  fscanf(fp,"%d",&data);
  printf("%4d",data);
 }
 printf("\n");
 fclose(fp);
 return 0;
}

第2个回答  2013-12-21
文件路径名要有且符合题意(自己手工打造,满意请采纳,不懂可以追问.)追问

这个是一个另写的函数,路径名path在主函数里传过来的,没有问题,这个已经测试过了

追答

那不清楚,你可以放到贴吧里去问一问。