求助:C语言按行读文件,始终想不出好办法,望高手指点

shzhsh22 2010-12-21 03:37:01
我现在遇到一个问题,就是按行读文件,例如:
.....
fdfdfd fdfdf fdf klklkl klk
fdf kl fdf ere er trtr rtr ere
......
先按行读入,然后逐个字符串存储,我是先用fgets,然后将每行存进一个char*类型中,再用sscanf逐个读入存储。
这样问题就出来,fgets需指定读入的个数大小,但是每一行的实际的字符个数无法预知,这样程序始终存在着bug。

望高手指点一个合适的方法解决这个问题,使其能以适当的大小读入,并能完整读入每一行,感激不尽!
...全文
672 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
freefei 2010-12-23
  • 打赏
  • 举报
回复
给每一行设置一个结尾标志,然后去读判断就可以了
luuillu 2010-12-23
  • 打赏
  • 举报
回复
用realloc动态分配内存,每次增加一倍.

char * readline( FILE *fp )
{
staic char* buf=NULL; //静态变量

int size=256; //初始分配内存大小
int len=0;
char ch;
if(buf!=NULL) //如果buf不空,释放掉原来的内存,重新分配。
{
free(buf);
buf=NULL;
}
buf=(char *)malloc( size* sizeof(char) );
if(buf==NULL)
{ fprintf(2,"内存分配失败") ;
exit(0);
}
while( (ch=fgetc(fp)) != EOF ) //每次读一个字符
{
if(len>size-1)
{
size=size*2;
buf=(char *)realloc(buf, size* sizeof(char) );
if(buf==NULL)
{ fprintf(2,"内存分配失败") ;
exit(0);
}

}
if(ch=='\n')
break;
buf[len++]=ch;
}
buf[len]='\0';
return buf;
}

wasx1 2010-12-22
  • 打赏
  • 举报
回复
用fprintf行么?
Rain208 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 shzhsh22 的回复:]
引用 11 楼 bravery36 的回复:

不浪费空间的做法不知道,很浪费空间的做法我倒是了解的。先用ftell获取文件的大小,然后将全部内容读进内存,接下来就可以轻松愉快地找换行符了.......
恩,这个方法挺好,但是空间浪费就太大了,呵呵,谢谢,继续等待解答~~~
[/Quote]

大文件处理一般都是先把一部分装入内存的。
比如你先开辟10M,然后读10M文件内容进内存
然后操作完后,再读取10M

不要一下就把所有文件内容装进内存,这样装载的过程也慢

shzhsh22 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bravery36 的回复:]

不浪费空间的做法不知道,很浪费空间的做法我倒是了解的。先用ftell获取文件的大小,然后将全部内容读进内存,接下来就可以轻松愉快地找换行符了.......
[/Quote]恩,这个方法挺好,但是空间浪费就太大了,呵呵,谢谢,继续等待解答~~~
赵4老师 2010-12-22
  • 打赏
  • 举报
回复
当末尾没有'\n'就说明读到超长行!
AnYidan 2010-12-22
  • 打赏
  • 举报
回复
c programming languague
dgf19880908 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 prohibit 的回复:]

引用 24 楼 luuillu 的回复:
//从文件fp 中读一串字符,直到遇到换行符('\n')或文件结束符,得到的字符串保存在buf中。

fscanf(fp,"%[^\n]",buf);
如果第一行1000个字符、第二行10个字符,buf的长度设为多大?LZ考虑的应该就是这个问题~
[/Quote]

要在读之前,就要分配一个刚好装得下一行内容的储存空间,这个思路is very BUG.
shadowlsj 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bravery36 的回复:]

不浪费空间的做法不知道,很浪费空间的做法我倒是了解的。先用ftell获取文件的大小,然后将全部内容读进内存,接下来就可以轻松愉快地找换行符了.......
[/Quote]

一直这么干,除非文件超规范
prohibit 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 luuillu 的回复:]
//从文件fp 中读一串字符,直到遇到换行符('\n')或文件结束符,得到的字符串保存在buf中。

fscanf(fp,"%[^\n]",buf);
[/Quote]如果第一行1000个字符、第二行10个字符,buf的长度设为多大?LZ考虑的应该就是这个问题~
gp341 2010-12-22
  • 打赏
  • 举报
回复
用fgets读出一行 然后用strtok得到每个字符串
luuillu 2010-12-22
  • 打赏
  • 举报
回复

//从文件fp 中读一串字符,直到遇到换行符('\n')或文件结束符,得到的字符串保存在buf中。

fscanf(fp,"%[^\n]",buf);
plusplus2010 2010-12-22
  • 打赏
  • 举报
回复
LZ问的是如何动态分配读每行所用的缓存。你们给的方法都有个MAX_LENGTH。。。
plusplus2010 2010-12-22
  • 打赏
  • 举报
回复
用C++的std::string::getline(ifstream, string)方法。
或者参考它的源代码在C里面自己写一个。
mikithebest 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bravery36 的回复:]

不浪费空间的做法不知道,很浪费空间的做法我倒是了解的。先用ftell获取文件的大小,然后将全部内容读进内存,接下来就可以轻松愉快地找换行符了.......
[/Quote]

同意
bravery36 2010-12-21
  • 打赏
  • 举报
回复
不浪费空间的做法不知道,很浪费空间的做法我倒是了解的。先用ftell获取文件的大小,然后将全部内容读进内存,接下来就可以轻松愉快地找换行符了.......
prohibit 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 shzhsh22 的回复:]
我现在遇到一个问题,就是按行读文件,例如:
.....
使其能以适当的大小读入,并能完整读入每一行,.....[/Quote]
“适当的大小”不确定吧,正如LZ所说、每一行字符有多有少,在不知道这一行有多少个字符的前提下而一次读一行,就算要动态分配,也不知道该分配多少啊,除非先测试出这一行的字符个数,不过这样好像更复杂化了吧,个人薄见~~
shzhsh22 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 binqray 的回复:]
超过了就循环读啊!!!
[/Quote]是要一次读取一行,就想C++中getline一样,如果超过来循环读的话,还是读取此行剩余的字符,而不是读取下一行啊
  • 打赏
  • 举报
回复
超过了就循环读啊!!!
liquorbin 2010-12-21
  • 打赏
  • 举报
回复
试试这个
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#define MAXLENGTH 1024

void main()
{
FILE * f;
char s[MAXLENGTH];
char c;
int i=0;
printf("input string and end with '#':\n");
while((c=getchar())!='#')
{
s[i]=c;
i++;
}
s[i]='\0';
while((f=fopen("test.txt","w"))==0)
{
printf("open file error");
return;
}
fputs(s,f);
fclose(f);
while((f=fopen("test.txt","r"))==0)
{
printf("open file error");
return;
}
while(!feof(f))
{
printf(fgets(s,1024,f));
}

}
加载更多回复(6)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧