C++,按行号读取文件

5
我想创建一个控制台项目,通过数字读取文件。例如:查找数字1 2,并且它只会在控制台中打印出包含这些数字的文件夹中的文本行。
   bibi                ceki     1     2
 hasesh              cekiii     1     3
   krki                 cko     1     2

在这种情况下,它只会打印出“bibi ceki”和“krki cko”。 在我的代码中,有很多缺失的东西。我没有一个循环来检查是否有正确的数字,但以下是我所能做到的最好的,并且我尝试过的:
#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;
}

你可以看到,使用fscanf的那行代码没有起作用,我不知道该怎么办。

我需要一些帮助和建议,如果有更好的方法,请尽可能具体地说明,因为我是c++/c的新手。

2个回答

6
你正在混合使用C语言的fscanf函数和C++语言的ifstream。
我建议使用C++,在这种情况下,你可以使用operator>>,就像这样:
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 ;

1
谈到C++时,看到实际使用的C++确实很不错。不错! - tadman
raz==1 && ode==2时,while(raz==1 && ode==2)会陷入无限循环。将它改为if(raz==1 && ode==2)即可。而且,由于你已经解析了str1str2,因此不需要使用getline()。可以使用if(raz==1 && ode==2) { cout << str1 << " " << str2 << endl; } - raymelfrancisco
@marom,循环**while(raz==1 && ode==2)**无限地打印第一行。 - kuki
1
@kuki 尝试过了,它可以正常工作。raz==1 && ode==2 打印出 bibi cekikrki cko。而 raz == 1 && ode == 3 则打印出 hasesh cekiii。我将 while(raz==1 && ode==2) 改为 if(raz==1 && ode==2) { cout << str1 << " " << str2 << endl; } - raymelfrancisco
1
成功了!! :D @raymelfrancisco,我该如何将您的评论标记为答案? - kuki
显示剩余6条评论

4

您可以使用std::getline逐行读取,直到代码匹配时,您可以将名称push_backstd::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();
}

输出:

bibi ceki
krki cko

我遇到了一些奇怪的错误。**错误:在C++98模式下不允许使用基于范围的“for”循环|**。我认为这个问题可以解决,我只需要修复这个错误。 - kuki
@kuki,你可以使用普通的for循环,我已经编辑了答案以使用它。当使用-std=c++11编译时,基于范围的for循环可以工作。 - Andreas DM
谢谢你的努力,看起来我找到了另一种适用于我的文本文件类型的解决方案。 - kuki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接