新手求助!C++,从输入文件中找到指定字符串,并将该字符串后面的内容全部输出。

Node Results
1001 0.00 1157.33 55.61 0.00
1002 0.00 1157.33 53.96 0.00
Link Results
1 2.27 0.01 0.00
6 2.04 0.02 0.00
Node Results
1001 0.00 1157.33 55.61 0.00
1002 0.00 1157.33 53.96 0.00
Link Results
1 2.27 0.01 0.00
6 2.04 0.02 0.00
Node Results
1001 0.00 1157.33 55.61 0.00
1002 0.00 1157.33 53.96 0.00
Link Results
1 2.27 0.01 0.00
6 2.04 0.02 0.00
文档中周期性出现“Node Results”和“Link Results”,将文档中所有“Node Results”后面的内容全部输出,小白新手,非常期待大神的指点!!!!!

1个回答

简单搜索 Node Results,遇到非 空格 回车 换行 tab 数字 . 就结束。然后继续查找 Node Results

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;

string findNodeString(FILE* fp)
{
    string outbuf;
    if(!fp)
    {
        return "";
    }
    int state = 0;
    int pos = 0;
    while(1)
    {
        char c = fgetc(fp);
        if(c==-1)
        {
            break;
        }
        switch(state)
        {
            case 0:
                pos = ftell(fp);
                if(c=='N')
                {
                    if(c=='N' && (c=fgetc(fp),c=='o')&&(c=fgetc(fp),c=='d')&&(c=fgetc(fp),c=='e')
                        &&(c=fgetc(fp),c==' ')&&(c=fgetc(fp),c=='R')&&(c=fgetc(fp),c=='e')
                        &&(c=fgetc(fp),c=='s')&&(c=fgetc(fp),c=='u')&&(c=fgetc(fp),c=='l')
                        &&(c=fgetc(fp),c=='t')&&(c=fgetc(fp),c=='s'))
                    {
                        state=1;
                    }
                    else
                    {
                        fseek(fp, pos + 1, SEEK_SET);
                    }
                }
//              else if(c=='L')
//              {
//                  if(c=='L' && (c=fgetc(fp),c=='i')&&(c=fgetc(fp),c=='n')&&(c=fgetc(fp),c=='k')
//                      &&(c=fgetc(fp),c==' ')&&(c=fgetc(fp),c=='R')&&(c=fgetc(fp),c=='e')
//                      &&(c=fgetc(fp),c=='s')&&(c=fgetc(fp),c=='u')&&(c=fgetc(fp),c=='l')
//                      &&(c=fgetc(fp),c=='t')&&(c=fgetc(fp),c=='s'))
//                  {
//                      state=1;
//                  }
//                  else
//                  {
//                         fseek(fp, pos + 1, SEEK_SET);
//                  }
//              }
                break;
            case 1:
                if(c==' ' || c=='\r' || c=='\n' || c=='\t' || (c>='0' && c<='9') || c=='.')
                {
                    outbuf+=c;
                    continue;
                }
                else
                {
                    //输出结果
                    pos = ftell(fp);
                    fseek(fp, -1,SEEK_CUR);
                    return outbuf;
                }
                break;
            default:
                break;

        }
    }
    return "";
}

int main(int argc,char** argv)
{
    FILE *fp = fopen("d:\\test\\test.txt","rb");
    if(fp)
    {
        while(1)
        {
            string str = findNodeString(fp);
            if(str.empty())
            {
                break;
            }
            cout << str << endl;
        }
        fclose(fp);
    }
    else
    {
        cout <<"fopen failed" << endl;
    }
    return 0;
}

yaluaidandan
路人路过 非常非常感谢!我还发表了一个一模一样,悬赏更好的提问,你也回答一下呗,我把悬赏值也一并给你,非常感谢!
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问