【问题标题】:istream object don't read any charistream 对象不读取任何字符
【发布时间】:2014-05-15 08:19:11
【问题描述】:

为什么调用 readsome() 方法后的 istream 对象没有在缓冲区中提供任何字符?类构造有没有错误?

StreamBuffer.h

#ifndef StreamBuffer_h
#define StreamBuffer_h

#include <string>
#include <fstream>
#include <iostream>
#include <iterator>

enum StreamBufferState
{
  STREAMBUFFER_OK = 0,
  STREAMBUFFER_EOF = 1
};

class StreamBuffer
{
    std::fstream file;
    std::istream istrm;
    int maxBufferSize;
    std::string buffer;
 public:
    StreamBuffer(int maxBuffSize, const std::string& filename);
    ~StreamBuffer();
    void SetMaxBufferSize(unsigned int maxBuffSize);
  StreamBufferState FullBufferWithData();
    std::string GetDataBuffer();
};

#endif

StreamBuffer.cpp

#include "StreamBuffer.h"

using namespace std;

StreamBuffer::StreamBuffer(int maxBuffSize, const std::string& filename) : istrm( !filename.empty() ? file.rdbuf() : cin.rdbuf() )
{
  SetMaxBufferSize(maxBuffSize);
    if(!filename.empty())
    {
        file.open(filename.c_str(),ios::in | ios::binary);
    }
    else
    {
        std::cin>>noskipws;
    }
}

StreamBuffer::~StreamBuffer()
{
    file.close();
}

void StreamBuffer::SetMaxBufferSize(unsigned int maxBuffSize)
{
  maxBufferSize = maxBuffSize;
}

StreamBufferState StreamBuffer::FullBufferWithData()
{
    istrm.readsome((char*)&buffer[0],maxBufferSize);
    if(istrm.eof())
        return STREAMBUFFER_EOF;
    return STREAMBUFFER_OK;
}

std::string StreamBuffer::GetDataBuffer()
{
    string buf = buffer;
  return buf;
}

文件已打开,但 readsome() 不读取缓冲区。

【问题讨论】:

    标签: c++ istream


    【解决方案1】:

    当您尝试读入一个空字符串时,您的代码中有undefined behavior。需要设置buffer的大小。


    一个不相关的逻辑错误:在FullBufferWithData 函数中,即使读取文件时出现错误,您也会返回“OK”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-28
      • 2015-02-03
      • 2011-02-23
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多