c语言 fscanf如何按照回车换行读取文本文档中的数据?

文本文档中的内容格式是
english
中文
即一行英文一行中文!
假设有如下链表结构:
struct word
{
char enword[18];
char cnword[128];
struct word * next;
};
如何读取该文本文档中的数据,将第一行的英文给enword,第二行的中文给cnword?而第二行的中文可能存在空格,如何只判断换行呢?
是利用指针遍历文件内容,然后存入链表,貌似二楼的getchar(),在这里不能用吧!

    fscanf函数不能够按照回车换行读取数据,它遇到空格字符时也会断开,建议使用fgets函数。

    scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
      ① 遇空格、“回车”、“跳格”键。
      ② 遇宽度结束。
      ③ 遇非法输入。

    fgets函数从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

    函数原型
    char *fgets(char *buf, int bufsize, FILE *stream);
    参数
    *buf: 字符型指针,指向用来存储所得数据的地址。
    bufsize: 整型数据,指明存储数据的大小。
    *stream: 文件结构体指针,将要读取的文件流。
    返回值
        成功,则返回第一个参数buf;
        在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
        如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-18
fscanf是遇到空格和回车就会截断的,推荐用文件留操作
#include <fstream>

ifstream fout;
fout.open(PathName);
while(!fout)
{
AfxMessageBox("打开文件失败!",MB_OK);
return ;
}
char x;
CString ss;
CString addss;
CString sx;
m_listData.ResetContent();
int datatotal=2*iTotal;
while(!fout.eof()&&datatotal>0)
{
if (datatotal<=0)
break;
fout.read(&x,1);
if (x==','||(int)x==10||(int)x==9) //如果X是回车,tab,逗号等分隔符
{
if (ss!="")
{
switch(n)
{
case 0: plist1[m].x=ss;n=1;break;
case 1: plist1[m++].y=ss;n=0;break;
}
datatotal--;
}
ss="";
}
else
{
if (x!=' " ' && x!=' '&&x!='('&&x!=')')
ss=ss+x;
}
}

这是我最近读文件用到的。
可以过滤字符。不过效率比较低,因为我是一个字符一个字符的读,存在临时变量x,然后通过限制截断,将累加的x的值即ss赋给变量。
这个可以过滤你想过滤掉的任意字符,就是效率比较低一点。
第2个回答  2009-12-19
char v[100],v2[100];
scanf("%[^\n]s",v);
getchar();
scanf("%[^\n]s",v2);
getchar();

这样可以按回车换行来读取两行文本。
第一句scanf读到回车时停止,此时回车符并没有被读进来,所以用getchar()把它读进来。此行读完。

fscanf同理,按照上面方法修改即可。
第3个回答  推荐于2017-09-02
#include <stdio.h>
#include <stdlib.h>

main()
{
char a[20],b[20],w[2],c[20],d[20];
FILE *fp;
fp=fopen("datainput.txt","r");
fscanf(fp,"%[^\n]s",&a);
fscanf(fp,"%c",&w);
fscanf(fp,"%[^\n]s",&b);
fscanf(fp,"%c",&w);
fscanf(fp,"%[^\n]s",&c);
fscanf(fp,"%c",&w);
fscanf(fp,"%[^\n]s",&d);
fscanf(fp,"%c",&w);
printf("a:%s\n",a);
printf("b:%s\n",b);
printf("c:%s\n",c);
printf("d:%s\n",d);
system("pause");
}
读取链表整理一下就行了
=====================================================
datainput.txt 中的文字为:
zhongguo
中 国
faguo
法 国本回答被提问者采纳