c语言——读取多行文本问题

用VC6写的一个简单程序,实现在点击打开时读入指定目录下的多行文本。

界面如下(很丑):

指定文件1.txt文件内容为:
abcd
abc
ab

但是运行生成的结果是:
abcd
abc
ab
ab

最后一行输出了两次,这是什么原因?

请详细说明一下,多谢~~~

打开按钮ID:ID_MENUITEMOPEN

文本框ID:IDC_EDIT1

涉及代码如下:

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case ID_MENUITEMOPEN:
{
FILE *p=fopen("c:\\1.txt","r"); //定义文件指针,读取指定目录文件
TCHAR ch[256];
TCHAR ed[256]={0};
while(!feof(p)) //检测指针是否到了文件尾
{
fgets(ch,sizeof(ch),p);
lstrcat(ed,ch);
int w=strlen(ed);
ed[w-1]='\0';
lstrcat(ed,"\r\n");
}
SetDlgItemText(hwnd,IDC_EDIT1,ed);
fclose(p);
}
break;
default:
break;
}
}

feof(p) 应当在读语句后测定,也就是:
读,测定,如果不是EOF则输出。
你现在的次序是:
测定,读,输出,回到测定。
所以读到EOF,你重复输出了最后一次成功读入的内容。
------------
简单修改:
if ( fgets(ch,sizeof(ch),p)==NULL) break;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-25
很简单,因为您的文本的最后一行之后还有一个新航,即最后一行内容并不是"ab",而是空,即'"ab"的下一行,需要改正代码如下即可
while(!feof(p))
//检测指针是否到了文件尾
{
memset(ch,
0,
256);
fgets(ch,
sizeof(ch),
p);
lstrcat(ed,
ch);
}
第2个回答  2015-11-06
1、用fgets函数可以读取文件中某行的数据,某列数据就必须一个一个读入每行的第几个字符,再存入到一个字符串当中。

2、例程:

#include<stdio.h>
#include<string.h>
void main()
{
char a[100],b[100],c[100];
int i=3,j=4,k=0; //第三行,第四列
FILE *fp = fopen("data.txt","r");
while(fgets(c,100,fp)){ //读入每行数据
i--;
if(i==0) strcpy(a,c); //读到第三行数据
b[k++]=c[j-1]; //把每行的那列字符拷到b中
}
b[k]=0;
printf("第%d行数据:%s\n",i,a);
printf("第%d列数据:%s\n",j,b);
fclose(fp);
}
相似回答