C++ rdbuf與文件流操作技巧

c++
小樊
110
2024-08-29 17:09:52
欄目: 編程語言

rdbuf() 是 C++ 中的一個(gè)函數(shù),用于獲取或設(shè)置流的緩沖區(qū)。它通常與文件流(如 ifstreamofstream)一起使用,以便在文件和程序之間傳輸數(shù)據(jù)。以下是一些關(guān)于如何使用 rdbuf() 和文件流操作的技巧:

  1. 從文件讀取數(shù)據(jù)

    要從文件讀取數(shù)據(jù),可以使用 ifstream 類,并將其緩沖區(qū)與 cin 的緩沖區(qū)交換。這樣,你可以像從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)一樣從文件讀取數(shù)據(jù)。

    #include <fstream>
    #include<iostream>
    
    int main() {
        std::ifstream file("input.txt");
        std::streambuf* cinbuf = std::cin.rdbuf(); // 保存原始 cin 緩沖區(qū)
        std::cin.rdbuf(file.rdbuf()); // 將 cin 緩沖區(qū)替換為文件緩沖區(qū)
    
        int a, b;
        std::cin >> a >> b;
    
        std::cin.rdbuf(cinbuf); // 恢復(fù)原始 cin 緩沖區(qū)
        file.close();
    
        std::cout << "Read from file: " << a << " " << b << std::endl;
        return 0;
    }
    
  2. 將數(shù)據(jù)寫入文件

    要將數(shù)據(jù)寫入文件,可以使用 ofstream 類,并將其緩沖區(qū)與 cout 的緩沖區(qū)交換。這樣,你可以像向標(biāo)準(zhǔn)輸出寫入數(shù)據(jù)一樣向文件寫入數(shù)據(jù)。

    #include <fstream>
    #include<iostream>
    
    int main() {
        std::ofstream file("output.txt");
        std::streambuf* coutbuf = std::cout.rdbuf(); // 保存原始 cout 緩沖區(qū)
        std::cout.rdbuf(file.rdbuf()); // 將 cout 緩沖區(qū)替換為文件緩沖區(qū)
    
        int a = 3, b = 4;
        std::cout << "Writing to file: " << a << " " << b << std::endl;
    
        std::cout.rdbuf(coutbuf); // 恢復(fù)原始 cout 緩沖區(qū)
        file.close();
    
        return 0;
    }
    
  3. 同時(shí)讀取和寫入文件

    要同時(shí)從一個(gè)文件讀取數(shù)據(jù)并將數(shù)據(jù)寫入另一個(gè)文件,可以使用 ifstreamofstream 類,并分別交換 cincout 的緩沖區(qū)。

    #include <fstream>
    #include<iostream>
    
    int main() {
        std::ifstream infile("input.txt");
        std::ofstream outfile("output.txt");
    
        std::streambuf* cinbuf = std::cin.rdbuf();
        std::cin.rdbuf(infile.rdbuf());
    
        std::streambuf* coutbuf = std::cout.rdbuf();
        std::cout.rdbuf(outfile.rdbuf());
    
        int a, b;
        std::cin >> a >> b;
        std::cout << "Read from input.txt and writing to output.txt: " << a + b<< std::endl;
    
        std::cin.rdbuf(cinbuf);
        std::cout.rdbuf(coutbuf);
    
        infile.close();
        outfile.close();
    
        return 0;
    }
    

通過使用 rdbuf() 和文件流操作,你可以輕松地在文件和程序之間傳輸數(shù)據(jù)。記住始終在操作完成后恢復(fù)原始緩沖區(qū),以避免意外的行為。

0