Chinaunix

标题: 问个小问题~^_^ [打印本页]

作者: 快乐的小巫师    时间: 2005-08-06 03:33
标题: 问个小问题~^_^
偶想一段数据转换一下,就像下面那个样子:

(中间出了点莫名其妙的问题)
代码如下:
  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <string.h>;

  4. int addr[2][4];
  5. char buffer[100];

  6. int main(int argc, char *argv[])
  7. {
  8.         FILE * in, * out;
  9.         int tmp;

  10.         switch(argc)
  11.         {
  12.                 case 2:
  13.                         out = stdout;
  14.                         break;
  15.                 case 3:
  16.                         if((out = fopen(argv[2],"w")) == NULL)
  17.                         {
  18.                                 printf("export file open error!!");
  19.                                 exit(2);
  20.                         }
  21.                         break;
  22.                 default:
  23.                         printf("input error!!");
  24.                         exit(1);
  25.         }

  26.         if((in = fopen(argv[1],"r")) == NULL)
  27.         {
  28.                 printf("inport file open error!!");
  29.                 exit(2);
  30.         }

  31.         while(feof(in) == 0)
  32.         {
  33.                 fscanf(in,"%d.%d.%d.%d~%d.%d.%d.%d %s%*[^\n]",
  34.                         &addr[0][0],&addr[0][1],&addr[0][2],&addr[0][3],&addr[1][0],&addr[1][1],&addr[1][2],&addr[1][3],buffer);
  35.                 for(int i = 0; i < 8; i++)
  36.                 {
  37.                         if(4 == i || 0 == i)fprintf(out,"(");

  38.                         for(int j = 0; j < 8; j++)fprintf(out,"%d", (addr[i/4][i%4] >;>; (7-j)) & 0x1);

  39.                         if(7 == i || 3 == i)fprintf(out,") ");
  40.                         else fprintf(out," ");
  41.                 }
  42.                 fprintf(out,"%s\n",buffer);
  43.         }
  44.        
  45.         fclose(in);
  46.         if(argc == 3)fclose(out);

  47.         printf("complete!!");
  48.         return 0;
  49. }
复制代码

编译选项如下:

运行的时候运行到一半的时候就定在一个位置了

就是这样,就定在那了~~~~
下面是一段原始数据

到底是什么道理嘛~~帮个忙哈
作者: renstone921    时间: 2005-08-06 09:36
标题: 问个小问题~^_^
看了你的代码后,我不知道
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
这些函数是干什么用的了.
作者: homesp    时间: 2005-08-06 10:13
标题: 问个小问题~^_^
我的对后 面那段数据 没问题的啊
作者: renstone921    时间: 2005-08-06 10:29
标题: 问个小问题~^_^
把这部分先注释调,然后加输出语句判读每次数据是否正确读入;
如果正确读入的话,那就是下面的代码有问题了.

for(int i = 0; i < 8; i++)
      {
         if(4 == i || 0 == i)fprintf(out,"(";

         for(int j = 0; j < 8; j++)fprintf(out,"%d", (addr[i/4][i%4] >;>; (7-j)) & 0x1);

         if(7 == i || 3 == i)fprintf(out," ";
         else fprintf(out," ";
      }
作者: 快乐的小巫师    时间: 2005-08-06 15:43
标题: 问个小问题~^_^
原帖由 "renstone921" 发表:
把这部分先注释调,然后加输出语句判读每次数据是否正确读入;
如果正确读入的话,那就是下面的代码有问题了

单个循环好像是没问题地~~~
可以正常输出613行,一共3084行
作者: 快乐的小巫师    时间: 2005-08-06 15:48
标题: 问个小问题~^_^
原帖由 "renstone921" 发表:
看了你的代码后,我不知道
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
这些函数是干什么用的了.

没做过网络编程~~~内存管理和文件系统段的内核还没搞定呢
(偶不是程序员,对每种库了解的不是那么多)
作者: apollolegend    时间: 2005-08-06 17:07
标题: 问个小问题~^_^
我想可能是输入文件的格式在某个地方有问题造成的,程序中的代码对输入的格式要求太严格.可以重点看看613或614行.
个人觉得应该这样写程序
Hex2BinString()用与将字节转换成2进制字符串
SpliteIP()用于分开两个用~连接的IP
BombIP()用于将IP拆到4字节数组中
主程序只有循环的框架
作者: 快乐的小巫师    时间: 2005-08-06 18:11
标题: 问个小问题~^_^
原帖由 "apollolegend" 发表:
我想可能是输入文件的格式在某个地方有问题造成的,程序中的代码对输入的格式要求太严格.可以重点看看613或614行.
个人觉得应该这样写程序
Hex2BinString()用与将字节转换成2进制字符串
SpliteIP()用于分开两个用~..........

发现了~~~在614行和615行隐藏着'o'   !!!!!'0'被它给代替了

谢谢你的建议    ~~~不过这么写就是因为数据格式是严格匹配的啊~~~~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2