繁体   English   中英

如何使用ifstream的ifstream使用数据长度而不是新行来读取文件?

[英]How to use ifstream of C++ to read from a file using length of the data rather than new line?

不管ifstream >>在找到换行符时终止读取文件,我都希望使用数据大小从文件中读取。 有没有办法做到这一点?

目前我使用mystream.read(字符串,长度),但我想使用“>>”运算符而不是read。

.read是你要做的事情方式。

想要用operator>>代替它并没有多大意义,这根本就没有做到这一点。

只需使用.read ,然后继续。


更新要么,或者我误解了你的问题,Kris是对的。

像这样的东西? 这将它读入std :: vector。

inline void util::operator>>(const std::string &address, std::vector<std::string> &v) throw()
{
    std::ifstream fin;
    fin.open(address.c_str());
    for(std::string s; std::getline(fin, s, '\n'); ) {
        v.push_back(s);}
}

虽然,这是我5年前写的一些旧代码。 不确定这是否是最佳做法,但也许可能有帮助? 如果我误解了,请忽略我:)

operator >>只接受一个参数 - 对目标的引用。 如果不能在某个地方传递长度,你真的没有选择,只能使用.read()方法。

也许你可以覆盖operator >>并传入一个你自己的特殊类来嵌入一个长度参数。

这似乎只是使用>>语法的很多工作。

那么,如果语法不会让您感到困惑,请考虑以下内容:

char g_buf[MAX_BUFFER_LEN];

// The operator>> does not stop reading until it hits the end of file or the data read equals to specified cnt
istream& operator>>(istream& in, int cnt)
{
    return in.getline(g_buf, cnt, char(6));
}

int main()
{
    ifstream in("e:/a.txt");

    // Reads 200 chars from file and put them in g_buf
    in>>200;

    cout<<g_buf<<endl;

    in.close();
}

如果您真的只想让客户端代码使用operator>> ,您可以编写一个使用中间类型调用.read()的运算符。

class Buffer
{
    char * myData;
    std::size_t mySize;
public:
    Buffer ( char * data, std::size_t size )
      : myData(data), mySize(size)
    {}
    friend operator>> ( std::istream& stream, Buffer& buffer )
    {
        return stream.read(buffer.myData, buffer.mySize);
    }
};

这允许你写:

static const std::size_t size = 100;
char data[size];
std::cin >> Buffer(data, size);

如果您知道要读取具有已知长度的多个零件,这可能非常有用,例如:

static const std::size_t header_size =  5;
static const std::size_t stream_size = 20;
static const std::size_t footer_size = 12;
char header[header_size];
char stream[stream_size];
char footer[footer_size];
std::cin >> Buffer(header, header_size)
         >> Buffer(stream, stream_size)
         >> Buffer(footer, footer_size);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM