我有这种形式的数据文件:
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
有什么建议吗?
答案 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
之前定义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;
答案 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 ......进一步处理,则必须添加一些行......