ifstream :: read不工作?

时间:2016-10-25 01:18:22

标签: c++ ifstream

我正在尝试从.csv文件中读取。下面有两个功能,一个用于写入,另一个用于读取。

该文件包含一个简单的表:

date,first,second
1     a      one
2     b      two
3     c      three
4     c      four

由于某种原因,声明while(file_stream.read(&c,1));没有读取任何内容。它停在第一个角色,我傻眼了。为什么。有线索吗?

#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

std::string filename;
std::string line_string;
ifstream file_stream;
stringstream ss;
vector< vector<string> > vec;
char c;

void read_file()
{
    filename = "test.csv";

    cout << filename << endl;

    file_stream.open(filename.c_str(),ios::out|ios::binary);
    if(file_stream.fail())
    {
        cout << "File didn't open" << endl;
        return;
    }

    if(file_stream.is_open())
        cout << "file opened" << endl;

    while(file_stream.read(&c,1));  // this isn't working
    {
        cout <<"char c is: " <<  c;
        ss << noskipws << c;
    }
    file_stream.close();
    cout << "string is: " << ss.str() << endl;

    //get each line
    int counter = 0;
    vector<string> invec;

    while(getline(ss,line_string,'\n'))
    {
        string header_string;
        stringstream header_stream;

        header_stream << line_string;

        while(getline(header_stream, header_string,','))
        {
            invec.push_back(header_string);
        }
        invec.push_back(header_string);

        vec.push_back(invec);
        invec.clear();
        counter++;
    }
}

void test_output()
{
    for(int i = 0; i < vec.size();i++)
    {
        for(int in = 0; in < vec[0].size(); in++)
            cout << vec[i][in] << "   ";

        cout << endl;
    }
}

int main()
{
    read_file();
    test_output();
}

1 个答案:

答案 0 :(得分:4)

非常小心地看

while(file_stream.read(&c,1));  // this isn't working
{
    cout <<"char c is: " <<  c;
    ss << noskipws << c;
}

;语句末尾的while字符不属于!您正在运行无体循环,直到read()失败才会终止,然后您的代码进入括号内的块以输出成功的 last 字符读(如果有的话)。

您需要删除错误的;字符:

while(file_stream.read(&c,1))  // this works
{
    cout <<"char c is: " <<  c;
    ss << noskipws << c;
}

现在,真正的问题是 - 为什么你首先将输入文件逐个字符地读入std::stringstream?您可以直接使用std::getline()输入std::ifstream

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

std::vector< std::vector<std::string> > vec;

void read_file()
{
    std::string filename = "test.csv";

    std::cout << filename << std::endl;

    std::ifstream file_stream;
    file_stream.open(filename.c_str(), ios::binary);
    if (!file_stream)
    {
        std::cout << "File didn't open" << std::endl;
        return;
    }

    std::cout << "file opened" << std::endl;

    //get each line
    std::vector<std::string> invec;
    std::string line;
    int counter = 0;

    if (std::getline(file_stream, line))
    {
        std::istringstream iss(line);    
        while (std::getline(iss, line, ','))
            invec.push_back(line);    
        vec.push_back(invec);
        invec.clear();
        ++counter;

        while (std::getline(file_stream, line))
        {
            iss.str(line);
            while (iss >> line)
                invec.push_back(line);    
            vec.push_back(invec);
            invec.clear();
            ++counter;
        }
    }
}

void test_output()
{
    if (!vec.empty())
    {
        for(int in = 0; in < vec[0].size(); ++in)
            std::cout << vec[0][in] << ",";

        std::cout << std::endl;

        for(int i = 1; i < vec.size(); ++i)
        {
            for(int in = 0; in < vec[i].size(); ++in)
                std::cout << vec[i][in] << "   ";

            std::cout << std::endl;
        }
    }
}

int main()
{
    read_file();
    test_output();
}