0

这里的目的是解析输入文件,如果文件在任何行中包含时间,我只需要从该行中提取时间信息并写入输出文件,其余行保持原样。我正在使用 fgets 获取行通过 line 和 sscanf 查看所需的模式,但这会给出 seg 错误。

这是我的代码:

#include<stdio.h>
int main()
{
   FILE *fIn,*fOut;
   char buffer[100];
   int Hr=0,Min=0,Sec=0,MSec=0;
   fIn = fopen("dat.txt","r+");
   fOut= fopen("kel.txt","w+");
   if (fIn == NULL) {
      printf("Can't open input file in.list!\n");
      exit(1);
   }
   while(!feof(fIn))
   {
         fgets(buffer,100,fIn);
#if 1
         if(sscanf(buffer,"%u:%u:%u.%u",Hr,Min,Sec,MSec) ==4)
         {
            fprintf(fOut,"%02u:%02u:%02u.%6u",Hr,Min,Sec,MSec);
            printf("hello");
            continue;
         }
#endif
         fputs(buffer,fOut);
   }
   fclose(fIn);
   fclose(fOut);
}

这是 dat.txt 的几行:

17:48:22.618782 IP n003-000-000-000.static.ge.com > n003-000-000-000.static.ge.com: ICMP echo request, id 2105, seq 4, length 64
        0x0000:  b870 f414 033b b870 f414 0343 0800 4500
        0x0010:  0054 0000 4000 4001 2e9c 0303 0305 0303
        0x0020:  0303 0800 e69d 0839 0004 43bc 4a52 8d13
        0x0030:  0300 0809 0a0b 0c0d 0e0f 1011 1213 1415
        0x0040:  1617 1819 1a1b 1c1d 1e1f 2021 2223 2425
        0x0050:  2627 2829 2a2b 2c2d 2e2f 3031 3233 3435
        0x0060:  3637
17:48:22.618817 IP n003-000-000-000.static.ge.com > n003-000-000-000.static.ge.com: ICMP echo reply, id 2105, seq 4, length 64
        0x0000:  b870 f414 0343 b870 f414 033b 0800 4500
        0x0010:  0054 7821 0000 4001 f67a 0303 0303 0303
        0x0020:  0305 0000 ee9d 0839 0004 43bc 4a52 8d13
        0x0030:  0300 0809 0a0b 0c0d 0e0f 1011 1213 1415
        0x0040:  1617 1819 1a1b 1c1d 1e1f 2021 2223 2425
        0x0050:  2627 2829 2a2b 2c2d 2e2f 3031 3233 3435
        0x0060:  3637

实际上,我正处于尝试将上述数据包写入 text2pcap 可理解形式的阶段。我应该使用 c 代码 [不会使用 od 和 hexdump]。

4

1 回答 1

2

您需要传递存储值的地址:sscanf

if(sscanf(buffer,"%u:%u:%u.%u", &Hr, &Min, &Sec, &MSec) ==4)
                                ^    ^     ^     ^

此外,正如 user694733 指出的那样,如果它们没有签名(由%u、 useunsigned int Hr等暗示)。

于 2013-10-03T08:05:50.703 回答