C++ C++,按数字读取文件行

C++ C++,按数字读取文件行,c++,ifstream,C++,Ifstream,我想创建一个按编号读取文件的控制台项目。示例:按数字查找12,它只在控制台中打印包含这些数字的文件夹中的文本行 bibi ceki 1 2 hasesh cekiii 1 3 krki cko 1 2 在这种情况下,它只需打印出“bibiceki”和“krkicko”。 在我的代码中有很多遗漏的东西。我没有一个循环来检查是否有正确的数字,但以下是

我想创建一个按编号读取文件的控制台项目。示例:按数字查找12,它只在控制台中打印包含这些数字的文件夹中的文本行

   bibi                ceki     1     2
 hasesh              cekiii     1     3
   krki                 cko     1     2
在这种情况下,它只需打印出“bibiceki”和“krkicko”。 在我的代码中有很多遗漏的东西。我没有一个循环来检查是否有正确的数字,但以下是我能做的最好的事情和我尝试的:

#include <fstream>
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main() {
    char str1[10], str2[10];
    int raz, ode;
    ifstream infile("file.txt");
    while (infile.good()) {
        fscanf(infile, "%s %s %d %d", str1, str2, &raz, &ode); //this thing cant be used lik this 
        while(raz==1 && ode==2) {
            string sLine;
            getline(infile, sLine);
            cout << sLine << endl;
        }
    }
    infile.close();
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
字符str1[10],str2[10];
int-raz,ode;
ifstream infle(“file.txt”);
while(infle.good()){
fscanf(infle,“%s%s%d%d”,str1,str2,&raz,&ode);//这个东西不能像这样使用
而(raz==1&&ode==2){
弦线;
getline(填充、sLine);

CUT< P>你正在混合C fSCANF函数和C++ IFSIFE.

我会用C++来计算,在这种情况下,你可以使用操作符>:

std::string str1, str2 ;
...
//substitute the following line with the one below
//fscanf(infile, "%s %s %d %d", str1, str2,&raz,&ode);
infile >> str1 >> str2 >> raz >> ode ;

您可以使用
std::getline
逐行读取,直到代码匹配为止,当代码匹配时,您可以
将名称向后推
std::vector
中。您还可以使用分隔符来构造文件,例如
“|”
,这样您可以读取该字符作为名称,其余字符作为代码。示例文件如下:

bibi ceki|1 2
hasesh cekiii|1 3
krki cko|1 2
以下是您如何实现这一目标的示例:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    ifstream in_file("file.txt", ios::in);
    vector<string> vec;
    string names; // store names like: "bibi ceki"
    string codes; // store codes like: "1 2"

    while (getline(in_file, names, '|')) {
        getline(in_file, codes, '\n');
        if (codes == "1 2")
            vec.push_back(names);
    }

    for (unsigned int i = 0; i != vec.size(); ++i)
        cout << vec[i] << endl;

    in_file.close();
}

当谈到C++时,很高兴看到实际的C++被使用。不错,你是对的,我在C++开始之前使用C。它不再调用错误,但仍然没有打印行。谢谢。它打印任何东西吗?你能看到调试器得到什么吗?或者只需添加一个STD::CUT@ KUCI试试,它就行了。<代码> RAZ=1和&ode==2
prints
bibi-ceki
krki-cko
。而
raz==1&&ode==3
prints
hasesh-cekiii
。我将
While(raz==1&&ode==2)
更改为
if(raz==1&&ode==2){行得通!!:D@raymelfrancisco,我怎样才能将你的评论标记为答案?我遇到了一些奇怪的错误。错误:C++98模式|中不允许使用基于范围的“for”循环。我想这会行得通的,我只需要修复这个错误。@kuki,你可以使用一个普通的for循环,我编辑了答案来使用它。基于范围的for循环在编译时可以工作使用
-std=c++11
感谢您的努力,看起来我找到了另一个解决方案,可以很好地处理我的txt文件类型。
bibi ceki
krki cko