首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

有关fgets读取文件时遇到换行符的有关问题,

2012-02-17 
有关fgets读取文件时遇到换行符的问题,急!!!!!!!!!各位大侠,小弟的代码想写入数据至文件,并且每次写入都从

有关fgets读取文件时遇到换行符的问题,急!!!!!!!!!
各位大侠,小弟的代码想写入数据至文件,并且每次写入都从新的一行开始。但是现在的问题是fgets的时候遇到换行符就结束了,只能读取第一行,请各位大侠帮忙看看怎么读取全部的数据出来?多谢了!
代码如下:
#include   "stdio.h "
#include   "conio.h "
#include   "stdlib.h "
#include   "string.h "

void   iwritefile();
void   ireadfile();

main()    
{    
iwritefile();
ireadfile();
return   0;
}

void   iwritefile()
{
int   a[7]={12,24,56,78,32,67,55};    
char   cha[7][2];
char   ch   =   '   ';
char   chrturn   =   '\n ';
FILE   *fpw;    

for(int   i=0;   i <7;   i++)
{
itoa(a[i],cha[i],10);
}

if((fpw=fopen( "test1.txt ", "a "))==NULL)    
{    
printf( "cann 't   open   file   test1.txt ");    
exit(0);
}    
fseek(fpw,0L,SEEK_END);
if   (0   !=   ftell(fpw))
{
fwrite(&chrturn,1,1,fpw);
}
for(i=0;i <7;++i)
{    
fwrite((cha+i),sizeof(cha[i]),1,fpw);
fwrite(&ch,1,1,fpw);
}      

fclose(fpw);    

printf( "the   originality   data   is:\n ");    
for(i=0;i <7;i++)    
{
printf( "%d   ",a[i]);
}
printf( "\n\n ");
}      


void   ireadfile()
{
FILE   *fpr;

if(NULL   ==   (fpr   =   fopen( "test1.txt ", "r ")))//&#210;&#212;&#214;&#187;&#182;&#193;·&#189;&#202;&#189;&#180;ò&#191;&#170;&#206;&#196;&#188;&#254;
{
printf( "error ");
exit(1);
}

fseek(fpr,0L,SEEK_END);
long   flen   =   ftell(fpr)+1;

char   *pflen   =   (char*)malloc(flen*sizeof(char));

rewind(fpr);

fgets(pflen,flen,fpr);

fclose(fpr);

printf( "%s\n ",pflen);
free(pflen);


}

[解决办法]

char *pflen = (char*)malloc(flen*sizeof(char));
rewind(fpr);
fgets(pflen,flen,fpr);

======>
char *pflen = (char*)malloc(flen*sizeof(char));
memset(pflen, 0, flen);
rewind(fpr);
fread(pflen, flen-1, 1, fpr);
[解决办法]
printf( "%s\n ",pflen)输出以NULL(\ '0 ')结尾的字符串, 你如果刚好使
pflen=文件长度, printf()到哪找NULL字符来结束输出呢? 所以后面就可能
输出乱码.

[解决办法]
fgets 遇到 '\n '返回NULL
[解决办法]
lightnut直接对文件进行操作,也是一种办法。但如果是从stdin流读入就出问题了。(比如把流重定向了)。

sprintf(fmt, "%%%d[^\n] ", flen); // 经测试,只有一个\
唉,把对的还改错了……
这个办法会把行首的空白符也删去。如果只过滤回车,则应该用:
sprintf(fmt, "%%%d[^\n]%%*[\n] ", flen);

就像Stroustrup所说的,我也羞于讲这种对C风格的串的处理,实在是太容易出错了。本来想让推荐你用fscanf来做的,现在看还是fgets比较合适。

测试代码:

/* 程序过滤所有的回车符,按行输出 */
#include <stdio.h>

main()
{
char fmt[64];
char line[256];


int len = 100;
sprintf(fmt, "%%%d[^\n]%%*[\n] ", len);
while (scanf(fmt, line) == 1) {
printf( "%s\n ", line);
}
}

热点排行
Bad Request.