0

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

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

有什么建议么?

4

5 回答 5

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;
}
于 2012-07-25T14:49:16.187 回答
1

您可以尝试这样的事情:

while(1)
{
    getline(in, x1);
    if (in.eof()) break;
    if (x1.find(z) != string::npos) {
        out << x1 << endl;
    }
}
于 2012-07-25T15:04:48.990 回答
0

您的问题是您在定义p之前x1定义。 p只是等于一个空白字符串,因为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;
于 2012-07-25T14:51:36.903 回答
0

你有两个问题。

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

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

于 2012-07-25T14:55:30.400 回答
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 ... 进行进一步处理,则必须添加一些行 ...

于 2012-07-25T15:01:47.610 回答