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

jenf 2007-05-22 05:36:14
各位大侠,小弟的代码想写入数据至文件,并且每次写入都从新的一行开始。但是现在的问题是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);


}
...全文
3677 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
milksea 2007-05-23
  • 打赏
  • 举报
回复
to lichunpu: 应该不行,读肯定是能读,但读得东西不对,要处理换行符的。
lichunpu 2007-05-23
  • 打赏
  • 举报
回复

fgets(pflen,flen,fpr);
改成
memset(pflen, 0, flen);
fread(pflen,flen,1,fpr);
可以满足要求吗?
milksea 2007-05-22
  • 打赏
  • 举报
回复
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);
}
}
Arthur_ 2007-05-22
  • 打赏
  • 举报
回复
fgets 遇到'\n'返回NULL
milksea 2007-05-22
  • 打赏
  • 举报
回复
我写的
sprintf(fmt, "%%%d[^\\n] ", flen);
就是写一个给fscanf()用的格式串。一般我们如果要读一行至多80个字符的一个字符串,写
fscanf(fpr, "%80[^\n] ", pflen);
但是里内的"%80[^\n]"中80是个变量flen,为此,我们先把这个字符串写到fmt里,就是上面那句了。

开始写的少一个\,所以应该是错的。
jenf 2007-05-22
  • 打赏
  • 举报
回复
哦,好的,谢谢了啊!!
lightnut 2007-05-22
  • 打赏
  • 举报
回复
那是随机的:)
jenf 2007-05-22
  • 打赏
  • 举报
回复
那为什么只有第一次时候有乱码,之后就没有了??
lightnut 2007-05-22
  • 打赏
  • 举报
回复
printf("%s\n",pflen)输出以NULL(\'0')结尾的字符串, 你如果刚好使
pflen=文件长度, printf()到哪找NULL字符来结束输出呢? 所以后面就可能
输出乱码.
jenf 2007-05-22
  • 打赏
  • 举报
回复
但是如果我把整个+1和fread那的-1都去掉的话,第一次创建了这个文件写入一行然后读取时显示末尾有乱码是怎么回事?
lightnut 2007-05-22
  • 打赏
  • 举报
回复
因为你前面把文件长度加了1, 我只好减去了:):

fseek(fpr,0L,SEEK_END);
long flen = ftell(fpr)+1; <======
jenf 2007-05-22
  • 打赏
  • 举报
回复
大哥,在不还???
jenf 2007-05-22
  • 打赏
  • 举报
回复
lightnut(),这样可以,但是为什么fread第二个参数需要减一呢?
lightnut 2007-05-22
  • 打赏
  • 举报
回复

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);
ayw215 2007-05-22
  • 打赏
  • 举报
回复
表示跳过换行:\n
jenf 2007-05-22
  • 打赏
  • 举报
回复
大哥,还在不???
jenf 2007-05-22
  • 打赏
  • 举报
回复
sprintf(fmt, "%%%d[^\n] ", flen);
您这句是什么意思??
milksea 2007-05-22
  • 打赏
  • 举报
回复
char fmt[64];
sprintf(fmt, "%%%d[^\n] ", flen); // 后面加空格可能更好些,试试看
fscanf(fpr, fmt, pflen);
milksea 2007-05-22
  • 打赏
  • 举报
回复
把多余的换行符读掉,可用
int c;
while ((c = fgetc(fp)) == '\n')
;
ungetc(c, fp);


也可以使用fscanf()函数读入,读的时候就跳过回车符(这算是一种比较“高级”的用法了吧):
char fmt[64];
sprintf(fmt, "%%%d[^\n]\n", flen);
fscanf(fpr, fmt, pflen);
jenf 2007-05-22
  • 打赏
  • 举报
回复
兄弟们,帮忙了,在线等:)

70,024

社区成员

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

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