按列读取文本文件并显示所有列值列表

时间:2017-03-05 14:43:48

标签: c++ file io

我正在尝试按列读取文件。主要功能是我的文件应该显示所有值的列之一。 我试图用矢量来做。

void search(){
const int COLUMNS = 4;

    vector< vector <int> > data;

    string filename = "bla.txt";

    ifstream ifile(filename.c_str());


    if (ifile.is_open()) {
        int num;

        vector <int> numbers_in_line;

        while (ifile >> num) {
            numbers_in_line.push_back(num);

            if (numbers_in_line.size() == COLUMNS) {
                data.push_back(numbers_in_line);
                numbers_in_line.clear();
            }
        }
    }
    else {
        cerr << "There was an error opening the input file!\n";
        exit(1);
    }

    //now get the column from the 2d vector:
    vector <int> column;
    int col = 2;//example: the 2nd column

    for (int i = 0; i < data.size(); ++i) {
        column.push_back(data[i][col - 1]);
        cout << column[i] << endl;
    }

    ifile.close();
}

我的文件如下:

John 1990 1.90 1
Peter 1980 1.88 0
...

此代码编译,但我没有在控制台中显示任何值。当我尝试调试最后一行时,它不会被缓存,所以我猜他们什么都不做?

2 个答案:

答案 0 :(得分:2)

ApiInterface apiService = ApiClient.getmRetrofitClient().create(ApiInterface.class);
        Call<RestResponse> call = apiService.getCountry();
        call.enqueue(new Callback<RestResponse>() {
            @Override
            public void onResponse(Call<RestResponse> call, Response<RestResponse> response) {
                List<Result> results = response.body().getResult();
            }

            @Override
            public void onFailure(Call<RestResponse> call, Throwable t) {
                Log.e("onFailure", t.getMessage());
            }
        });

永远不会输入循环,因为while (ifile >> num) { num,输入行的第一个元素是int,不能解释为John,所以{ {1}}设置为错误状态,循环条件立即为false。

干净的解决方法是首先使用int读取整行,然后将结果ifile标记,例如使用std::getline

该标记化产生的单个std::string令牌可以转换为具有std::istringstream等功能的适当类型。

答案 1 :(得分:1)

一步一步地确保每一步都是正确的。

  1. 读取每一行,然后打印出来以确保您正确执行此操作。
  2. 您需要拆分每一行。在这一步之后,你将把John,1990等作为字符串。 My favorite split method
  3. 现在将第2-4列转换为整数。
  4. 您可以轻松找到每个步骤的良好解决方案。