【问题标题】:reading a document and finding a specific word in that document阅读文档并在该文档中查找特定单词
【发布时间】:2014-10-15 00:13:29
【问题描述】:

我有以下文件:

WTPZ24 KNHC 032040
TCMEP4

TROPICAL STORM SIMON FORECAST/ADVISORY NUMBER   9
NWS NATIONAL HURRICANE CENTER MIAMI FL       EP192014
2100 UTC FRI OCT 03 2014

THERE ARE NO COASTAL WATCHES OR WARNINGS IN EFFECT.

TROPICAL STORM CENTER LOCATED NEAR 18.8N 110.6W AT 03/2100Z
POSITION ACCURATE WITHIN  20 NM

REPEAT...CENTER LOCATED NEAR 18.8N 110.6W AT 03/2100Z
AT 03/1800Z CENTER WAS LOCATED NEAR 18.6N 110.1W

FORECAST VALID 04/0600Z 19.2N 112.2W
MAX WIND  65 KT...GUSTS  80 KT.
64 KT... 10NE   0SE   0SW  10NW.
50 KT... 30NE  30SE  20SW  20NW.
34 KT... 50NE  50SE  40SW  40NW.

FORECAST VALID 04/1800Z 20.0N 114.3W
MAX WIND  75 KT...GUSTS  90 KT.
64 KT... 20NE  10SE  10SW  20NW.

我正在尝试用 C 语言编写一个程序,该程序将读取文件并找到单词字符串 FORECAST VALID。每当一行有 FORECAST VALID 字样时,我希望程序在该行之前打印该行和“===>”。对于文档的其余部分,我只希望它简单地打印该行。

程序的最终输出应该是这样的:

REPEAT...CENTER LOCATED NEAR 18.8N 110.6W AT 03/2100Z
AT 03/1800Z CENTER WAS LOCATED NEAR 18.6N 110.1W

===>FORECAST VALID 04/0600Z 19.2N 112.2W
MAX WIND  65 KT...GUSTS  80 KT.
64 KT... 10NE   0SE   0SW  10NW.
50 KT... 30NE  30SE  20SW  20NW.
34 KT... 50NE  50SE  40SW  40NW.

===>FORECAST VALID 04/1800Z 20.0N 114.3W
MAX WIND  75 KT...GUSTS  90 KT.
64 KT... 20NE  10SE  10SW  20NW.

我确实有一些 sn-ps 代码可以在没有 ===> 的情况下逐字打印文档,但我只需要帮助来了解如何从一行中隔离出 FORECAST VALID 以便将 ===> 放在这些行中:

FILE *fr;            /* declare the file pointer */

main()
{
   int n;
   char line[800];
   char buf[255];
   fr = fopen ("wtnt23.knhc.201410141453", "rt");  /* open the file for reading */

   while(fgets(line, 800, fr) != NULL)
   {
    sscanf (line, "%s", buf);
    if (buf="FORECAST")
   {
       printf("===>%s",line);
   }
   else
   {
        printf("%s",line);
   }
   fclose(fr);  /* close the file prior to exiting the routine */
} /*of main*/

【问题讨论】:

  • 您可能会发现标准 C 库函数 strncmp() 对您正在尝试做的事情很有用。

标签: c parsing text


【解决方案1】:

if (buf="FORECAST") 完全错误。它不是比较的,你不能用 = 复制到 char 数组...

你只需要这样做:

while(fgets(line, 800, fr) != NULL)
{
   if(0 == strncmp(line, "FORECAST VALID", strlen("FORECAST VALID")) )
   {
       printf("===>%s",line);
   }
   else
   {
        printf("%s",line);
   }
}

【讨论】:

    【解决方案2】:

    我会使用 std::stringsiostreams 而不是 char 数组和 FILE*

    有点像:

    int main()
    {
        std::ifstream ifs("wtnt23.knhc.201410141453");
    
        std::string line;
    
        while(std::getline(ifs, line)) // loop as long as getline() succeeds
        {
            if(line.find("FORECAST VALID") == 0) // line starts with this?
            {
                 // output ===>
            }
            // output line + linefeed
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2012-10-31
      • 2015-09-07
      相关资源
      最近更新 更多