簡體   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