如何用c ++读取文件?

时间:2016-01-21 22:33:08

标签: c++ main ifstream

我试图在我的方法“加载”中读取文件。这个文件是这样的:

3
3 Futech tablet 2 7.95
1 El_general_en_su_laberinto Gabriel_García_Márquez 23.50
2 Carne_picada 1 4.56

第一行是项目数,我的方法应加载并打印如下内容:

3 Futech tablet 2 7.95

这是我的方法加载

的类
    #include "ItemProccesor.h"
    #include<string>
    #include<iostream>
    #include<fstream>
    #include <stdlib.h>

    using namespace std;

    ItemProcessor::ItemProcessor() {
        // TODO Auto-generated constructor stub

    }

    ItemProcessor::~ItemProcessor() {
        // TODO Auto-generated destructor stub
    }

    void ItemProcessor::load(string archivo){
int tam;
        int tipo;
        int cant;
        string cad1;
        string cad2;
        float precio;
        ifstream myfile;
        myfile.open(archivo.c_str());
        if (myfile.is_open()){
            myfile >> tam;

            for(int n= 0; n < tam; n++) {
                myfile >> tipo;
                cout << tipo << cad1;
            }
        }
        myfile.close();

    }

其实我的方法打印:

333

就像总是采取相同的路线。这是我的主要方法:

#include <iostream>
#include <string>
#include "ItemProccesor.h"

int main(int argc, char **argv) {
  ItemProcessor *processor = new ItemProcessor();
  processor->load("lista.txt");

}

¿我怎么能去下一行?

3 个答案:

答案 0 :(得分:2)

不确定这是否是唯一的问题,但您已阅读tipo两次。尝试替换

myfile >> tipo >> cad1 >> cad2 >> cant >> precio;

myfile >> cad1 >> cad2 >> cant >> precio;

答案 1 :(得分:1)

您的输入文件似乎搞砸了。有时一行有四列,有时五列,有时三列。

这使得阅读非常难!

如果无法修复文件,则必须一次读取每一行,然后使用标记生成器在空格处拆分行,以便在处理行之前计算每行中的列数。

答案 2 :(得分:1)

你的方法正在打印333,因为只是你没有遍历这些行。

  void ItemProcessor::load(string archivo){
            int cant;
            float precio;
            string tipo, cad1, cad2, line;

            ifstream myfile(archivo.c_str());
            if(myfile.is_open())
            {
                while(getline(myfile,line))
                {
                     myfile >> tipo >> cad1 >> cad2 >> cant >> precio;
                     cout << tipo << " "<< cad1 <<" "<< cad2 <<" "<<cant <<" "<< precio << endl;
                }
            }
            else
                cout <<"error " << endl;
            myfile.close();
        }

输出

3 Futech tablet 2 7.95
1 El_general_en_su_laberinto Gabriel_García_Márquez 23 0.50
2 Carne_picada 1 4.56
有趣的是,它将 23.50 转换为 23 0.50 。不知道为什么但是很好的lolololol。至少它有效。