从数据文件中选择某些行

时间:2012-07-25 14:46:59

标签: c++ text-files

我有这种形式的数据文件:

B123 1 3 4
f
g=1
B123 3 4 4
t
z=2
.
.
.

我想做的是从以B123开头的行中选择数据;

这是我的尝试:

ifstream in("Data");
ofstream out("output");

string x1, x2, x3, x4;
char z[] = "B123";
const char *p;
p=x1.c_str();

while(1)
{
    in>> x1;
    if(!(strcmp(z,p)))
    {
        if((in>>x1>>x2>>x3>>x4))
        {
             output<<x1<<x2<<x3<<x4;
        }
        else
             break;
     }
}

return 0;

但是,这样,我只得到一个空的输出文件。我想得到:

B123 1 3 4
B123 3 4 4

有什么建议吗?

5 个答案:

答案 0 :(得分:4)

阅读文件的行,找到B123的匹配项,如果找到,请保存。伪代码:

while !eof():
   line = file.readlines()
   if "B123" in line:
        cout <<< line << endl

另外,我建议您使用strstr()代替strcmp()。我想你只需要在行中找到子串B123

// string::substr
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string str="We think in generalities, but we live in details.";
                             // quoting Alfred N. Whitehead
  string str2, str3;
  size_t pos;

  str2 = str.substr (12,12); // "generalities"

  pos = str.find("live");    // position of "live" in str
  str3 = str.substr (pos);   // get from "live" to the end

  cout << str2 << ' ' << str3 << endl;

  return 0;
}

答案 1 :(得分:1)

您可以尝试这样的事情:

while(1)
{
    getline(in, x1);
    if (in.eof()) break;
    if (x1.find(z) != string::npos) {
        out << x1 << endl;
    }
}

答案 2 :(得分:0)

您的问题是在定义p之前定义x1p只是等于一个空字符串,因为x1也是如此。相反,你需要这样做:

ifstream in("Data");
ofstream out("output");

string x1, x2, x3, x4;
char z[] = "B123";
const char *p;


while(1)
{
    in>> x1;
    p=x1.c_str();
    if(!(strcmp(z,p)))
    {
        if((in>>x1>>x2>>x3>>x4))
        {
             output<<x1<<x2<<x3<<x4;
        }
        else
             break;
     }
}

return 0;

答案 3 :(得分:0)

你有两个问题。

首先,在字符串存在之前,您将获得指向字符串的指针。每次读取字符串时,内部存储都可能会更改并使前一个指针无效。您需要在读取字符串后将.c_str()调用移动到某个点。

第二个问题是您使用strcmp来比较整个字符串。请尝试使用strncmp来比较有限数量的字符。

答案 4 :(得分:0)

如果您只是在B123之后读取数据而只是输出它们,那么下面的代码片段就可以了

ifstream in("data");
ofstream out("out");
string line;
while (getline(in, line)) {
    if (line.length() >= 4 && line.substr(0, 4) == "B123") {
        out << line << "\n";
    }
}

如果您真的需要x1,x2 ......进一步处理,则必须添加一些行......