ifstream::read not working?

ifstream::read not working?

本文关键字:working read ifstream not      更新时间:2023-10-16

我正在尝试从.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();
}

非常非常仔细地查看不正常的行:

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

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

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

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();
}