Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从数据文件中选择某些行_C++_Text Files - Fatal编程技术网

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”