有关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 ")))//ÒÔÖ»¶Á·½Ê½´ò¿ªÎļþ
{
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);
}
}