C++ 从数据文件中选择某些行
我有此表单的数据文件:C++ 从数据文件中选择某些行,c++,text-files,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)
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
,如果找到了,保存它。伪代码:
while !eof():
line = file.readlines()
if "B123" in line:
cout <<< line << endl
读取文件的行,找到与B123的匹配项,如果找到,则保存该匹配项。伪代码:
while !eof():
line = file.readlines()
if "B123" in line:
cout <<< line << endl
您的问题是在定义
x1
之前定义了p
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;
ifstream-in(“数据”);
流出(“输出”);
字符串x1、x2、x3、x4;
字符z[]=“B123”;
常量字符*p;
而(1)
{
in>>x1;
p=x1.c_str();
if(!(strcmp(z,p)))
{
如果((在>>x1>>x2>>x3>>x4中))
{
输出您的问题是在定义x1
之前定义了p
。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;
ifstream-in(“数据”);
流出(“输出”);
字符串x1、x2、x3、x4;
字符z[]=“B123”;
常量字符*p;
而(1)
{
in>>x1;
p=x1.c_str();
if(!(strcmp(z,p)))
{
如果((在>>x1>>x2>>x3>>x4中))
{
输出您有两个问题
首先,在字符串存在之前,您会得到一个指向该字符串的指针。每次读取字符串时,内部存储器可能会更改并使以前的指针无效。您需要在读取字符串后将.c_str()
调用移动到某个点
第二个问题是您正在使用比较整个字符串的strcmp
。请尝试使用strncmp
来比较有限数量的字符。您有两个问题
首先,在字符串存在之前,您会得到一个指向该字符串的指针。每次读取字符串时,内部存储器可能会更改并使以前的指针无效。您需要在读取字符串后将.c_str()
调用移动到某个点
第二个问题是,您使用的是比较整个字符串的strcmp
。请尝试使用strncmp
来比较有限数量的字符。如果您仅读取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";
}
}
ifstream-in(“数据”);
流出(“流出”);
弦线;
while(getline(in,line)){
如果(line.length()>=4&&line.substr(0,4)=“B123”){
out如果您读取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";
}
}
ifstream-in(“数据”);
流出(“流出”);
弦线;
while(getline(in,line)){
如果(line.length()>=4&&line.substr(0,4)=“B123”){
out您可以尝试以下方法:
while(1)
{
getline(in, x1);
if (in.eof()) break;
if (x1.find(z) != string::npos) {
out << x1 << endl;
}
}
while(1)
{
getline(in,x1);
如果(in.eof())中断;
if(x1.find(z)!=string::npos){
out您可以尝试以下方法:
while(1)
{
getline(in, x1);
if (in.eof()) break;
if (x1.find(z) != string::npos) {
out << x1 << endl;
}
}
while(1)
{
getline(in,x1);
如果(in.eof())中断;
if(x1.find(z)!=string::npos){
你为什么要混合使用std::string
和C样式的字符串?你可以使用=
操作符比较两个std::string
。除非有更多问题,否则我的建议是grep“^B123”你的_文件
。我明白了,好吧,我不知道我在做什么。谢谢你的评论。你为什么要混合使用std::string
和C样式的字符串?你可以使用=
操作符比较两个std::string
。除非有更多问题,否则我的建议是grep“^B123”你的_文件
。我明白了,好的,我不知道我在做什么。谢谢你的评论。我明白了,所以我用这种方法将过程分为两个步骤。输出从B123开始的行,然后从结果输出文件中读取我想要的数据。我会试试这个。谢谢。@愚蠢我可以给你代码,但它不会使你成为一个更好的程序呃.谢谢你:p我可以使用:getline,但是我怎么能测试这行是否包含B123?有没有一个简单的方法?@愚蠢我已经用other更新了我的答案,包括你可以测试这行是否包含B123
谢谢你的帮助和宝贵的建议,+1。我不得不选择Michael的答案作为解决方案,因为它明确地说明了这一点我明白了,所以我把这个过程分成两个步骤。输出从B123开始的行,然后从生成的输出文件中读取我想要的数据。我会试试这个。谢谢。@愚蠢,我可以给你代码,但不会让你成为一个更好的程序员。谢谢你:p我可以使用:getline,但是我怎么能这样呢st如果这行包含B123?有没有一个简单的方法?@愚蠢我已经更新了我的其他答案,包括你可以测试这行是否包含B123
谢谢你的帮助和宝贵的建议,+1。我不得不选择Michael的答案作为解决方案,因为它明确地满足了我的要求。z必须在行,将比较“!=string::npos”转换为“==0”,必须在行的开头,将比较“!=string::npos”转换为“==0”