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

2 つの問題があります。

まず、文字列が存在する前に文字列へのポインターを取得していることです。文字列を読み取るたびに、内部ストレージが変更され、以前のポインターが無効になる可能性があります。.c_str()文字列が読み取られた後、呼び出しをポイントに移動する必要があります。

2 番目の問題は、文字列全体strcmpを比較する whichを使用していることです。限られた数の文字を比較するために代わりに使用してみてください。strncmp

于 2012-07-25T14:55:30.400 に答える
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;
于 2012-07-25T14:51:36.903 に答える
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 に答える