免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: narry
打印 上一主题 下一主题

在读取文本文件时遇到的怪问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-10-09 11:27 |只看该作者

在读取文本文件时遇到的怪问题

对不起,我说错了,不过好像不同的系统fgets()的处理不同,而使用fgetc()就不会有这个问题

论坛徽章:
0
12 [报告]
发表于 2004-10-09 11:40 |只看该作者

在读取文本文件时遇到的怪问题

没有什么,我觉得这个问题太奇怪了,第一次遇到,大家给出出主意,我用的是sco

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2004-10-09 12:23 |只看该作者

在读取文本文件时遇到的怪问题

[quote]原帖由 "torrent"]你多用了一对括号[/quote 发表:


这个,没什么关系吧?   

论坛徽章:
0
14 [报告]
发表于 2004-10-09 12:53 |只看该作者

在读取文本文件时遇到的怪问题

//这是我编的完整的程序,用于测试指定机器端口的打开情况,大家来找找这个//问题,我用的是sco,cc编译器
#include<stdio.h>;
#include<string.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <errno.h>;
#include <netdb.h>;
#include <signal.h>;
struct def
{char offinum[10];
char ip[20];
char port[5];
char type[2];
}filedef[100];

int port_scan(struct def *p)
{
int probeport = 0;
struct hostent *host;
int err,  net;  
struct sockaddr_in sa;
strncpy((char *)&sa,"",sizeof sa);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr(p->;ip);
sa.sin_port = htons(atoi(p->;port));
net = socket(AF_INET,SOCK_STREAM,0);
if(net<0)
{
perror("\nsocket";
exit(2);
}
err = connect(net,(struct sockaddr *) &sa,sizeof sa);
if(err<0)
{
printf("\r";
fflush(stdout);
printf("%s %s %s %s refused. \n",p->;offinum,p->;ip,p->;port,p->;type);
}
  else
{
printf("%s %s %s %s accept. \n",*p->;offinum,p->;ip,p->;port,p->;type);
   if(shutdown(net,2)<0)
{
perror("\nshutdown";
exit(2);
}
}
close(net);
//}
printf("\r";
fflush(stdout);
return(0);
}
int readconf()
{
FILE *fp=NULL;
int num=0;
char  *p;
char buf[255];
char filename[40];
     sprintf(filename,"/study/study2/checkport";
     if ((fp=fopen(filename,"r")==NULL)
        { printf("read error";
         return -1;
        };
     while((p=fgets(buf,255,fp))!=NULL)
     {  
        sscanf(buf,"%s %s %s %s",filedef[num].offinum,filedef[num].ip,filedef[num].port,filedef[num].type);
        printf("%s %s %s %s",filedef[num].offinum,filedef[num].ip,filedef[num].port,filedef[num].type);
        num++;
     }
     fclose(fp);
     return num;
}

void main()
{
int num,i;

  num=readconf();
  if (num==-1)
    exit(0);
   for(i=0;i<num;i++)
      port_scan(&filedef);
}
/*checkport 的内容为:
jia 172.16.9.40 7007 T
lei 172.16.9.42 7007 T*/

论坛徽章:
0
15 [报告]
发表于 2004-10-09 13:14 |只看该作者

在读取文本文件时遇到的怪问题

简化这个问题。你先写一个小程序,用 fgets 读这个文件内容,然后输出,看是否还出错。

论坛徽章:
0
16 [报告]
发表于 2004-10-09 13:21 |只看该作者

在读取文本文件时遇到的怪问题

谢谢,我马上试试

论坛徽章:
0
17 [报告]
发表于 2004-10-09 13:43 |只看该作者

在读取文本文件时遇到的怪问题

我又重新写了个简单的程序,能正常运行,但是我发现个不理解的地方,望高手指点,程序如下:
#include<stdio.h>;
struct def
{char offinum[10];
char ip[20];
char port[5];
char type[2];
}filedef[100];
int readconf()
{
FILE *fp=NULL;
int num=0;
char  *p;
char buf[255];
char filename[40];
     sprintf(filename,"/study/study2/checkport";
     if ((fp=fopen(filename,"r")==NULL)
        { printf("read error";
         return -1;
        };
     while((p=fgets(buf,255,fp))!=NULL)
     {  
        sscanf(buf,"%s %s %s %s",filedef[num].offinum,filedef[num].ip,filedef[num].port,filedef[num].type);
        printf("%s %s %s %s\n",filedef[num].offinum,filedef[num].ip,filedef[num].port,filedef[num].type);
        num++;
     }
     fclose(fp);
     return num;
}
int main()
{readconf();
return 1;
}
我用dbx调试时,如下:
[1] stop at 20
(dbx) run
[1] stopped in readconf at line 20
   20        while((p=fgets(buf,255,fp))!=NULL)
(dbx) s
stopped in readconf at line 25
   25        }
(dbx) s
stopped in readconf at line 22
   22           sscanf(buf,"%s %s %s %s",filedef[num].offinum,filedef[num].ip,fi
ledef[num].port,filedef[num].type);
(dbx) s
stopped in readconf at line 23
   23           printf("%s %s %s %s",filedef[num].offinum,filedef[num].ip,filede
f[num].port,filedef[num].type);
(dbx) s
stopped in readconf at line 24
   24           num++;
(dbx) s
stopped in readconf at line 25
   25        }
不知为什么,程序第一次运行到20行时会跳到25行的代码,望高手解答,谢谢

论坛徽章:
0
18 [报告]
发表于 2004-10-09 13:51 |只看该作者

在读取文本文件时遇到的怪问题

buf里面有脏数据的缘故吧,清0试试看

论坛徽章:
0
19 [报告]
发表于 2004-10-09 14:05 |只看该作者

在读取文本文件时遇到的怪问题

我添加了bzero(buf,255)后,问题依旧,

论坛徽章:
0
20 [报告]
发表于 2004-10-09 14:19 |只看该作者

在读取文本文件时遇到的怪问题

好象是正常的。dbx 我没用过,s 估计是 setp in,会跑到函数调用里去,也就是fgets。但 fgets 不能调试,所以有一些混乱的输出。

以上是我的猜测,你可以改用 n (下一句,跳过函数调用)试一试。

ps>; 不用 bzero,那个没关系的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP