C++實現(xiàn)將內(nèi)容寫入文件的方法總結(jié)
一、C語言輸出內(nèi)容到文件
使用 C 的文件 I/O 函數(shù),例如 fopen(),fprintf(),fputs() 和 fwrite() 等。這些函數(shù)由 C 語言中的標準庫 stdio.h 提供。
#include <stdio.h> int main() { // 以寫入模式打開文件 FILE *fp = fopen("myfile.txt", "w"); if (fp == NULL) { // 打開文件失敗 printf("Error opening file!\n"); return 1; } // 使用 fprintf() 寫入字符串 fprintf(fp, "Hello, world!\n"); // 使用 fputs() 寫入字符串 fputs("This is another string.\n", fp); // 使用 fwrite() 寫入二進制數(shù)據(jù) int num = 42; fwrite(&num, sizeof(int), 1, fp); // 關閉文件 fclose(fp); return 0; }
在這個代碼示例中,我們首先使用 fopen() 函數(shù)以寫入模式打開了一個文件,然后使用 fprintf(),fputs() 和 fwrite() 向文件寫入了字符串和二進制數(shù)據(jù),最后使用 fclose() 函數(shù)關閉了文件。請注意,在使用 fwrite() 函數(shù)寫入二進制數(shù)據(jù)時,我們需要提供要寫入的數(shù)據(jù)的指針,以及每個數(shù)據(jù)單元的大小和要寫入的數(shù)據(jù)單元數(shù)。
二、C++文件輸入/輸出流
此種是C++標準的輸入輸出,一般不會帶來字符種類不同引發(fā)的問題,比如寬字節(jié)和窄字節(jié)之間的區(qū)別,肯能我們打開文件內(nèi)容都一樣,但是涉及加密、編碼等操作寬窄字符是有區(qū)別的,這個是有教訓的,牢記。
下面是使用 C++ 中的文件輸入/輸出流的代碼示例:
#include <fstream> #include <iostream> int main() { // 以寫入模式打開文件 std::ofstream out("myfile.txt"); if (!out) { // 打開文件失敗 std::cerr << "Error opening file!" << std::endl; return 1; } // 使用流操作符 << 寫入字符串 out << "Hello, world!" << std::endl; out << "This is another string." << std::endl; // 使用 write() 寫入二進制數(shù)據(jù) int num = 42; out.write(reinterpret_cast<char*>(&num), sizeof(int)); // 關閉文件 out.close(); // 以讀取模式打開文件 std::ifstream in("myfile.txt"); if (!in) { // 打開文件失敗 std::cerr << "Error opening file!" << std::endl; return 1; } // 使用流操作符 >> 讀取字符串 std::string s; in >> s; std::cout << s << std::endl; // 使用 read() 讀取二進制數(shù)據(jù) in.read(reinterpret_cast<char*>(&num), sizeof(int)); std::cout << num << std::endl; // 關閉文件 in.close(); return 0; }
在這個代碼示例中,我們首先使用 ofstream 對象以寫入模式打開了一個文件,然后使用流操作符 << 向文件寫入了字符串,使用 write() 寫入了二進制數(shù)據(jù),最后使用 close() 關閉了文件。然后,我們使用 ifstream 對象以讀取模式打開了同一個文件,使用流操作符 >> 讀取了字符串,使用 read()讀取了二進制數(shù)據(jù),最后使用 close() 關閉了文件。
請注意,當使用 write() 寫入二進制數(shù)據(jù)時,我們需要將要寫入的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個數(shù)據(jù)單元的大小和要寫入的數(shù)據(jù)單元數(shù)。當使用 read() 讀取二進制數(shù)據(jù)時,我們也需要將要讀取的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個數(shù)據(jù)單元的大小和要讀取的數(shù)據(jù)單元數(shù)。
另一個 C++ 標準庫中的文件輸入/輸出流類型叫做 filebuf,它可以通過標準輸入/輸出流來讀寫文件。例如,下面是使用 filebuf 的代碼示例:
#include <fstream> #include <iostream> int main() { // 以寫入模式打開文件 std::filebuf fb; fb.open("myfile.txt", std::ios::out); if (!fb.is_open()) { // 打開文件失敗 std::cerr << "Error opening file!" << std::endl; return 1; } // 將文件緩沖區(qū)關聯(lián)到標準輸出流 std::ostream out(&fb); // 使用標準輸出流寫入字符串 out << "Hello, world!" << std::endl; out << "This is another string." << std::endl; // 使用 sputn() 寫入二進制數(shù)據(jù) int num = 42; fb.sputn(reinterpret_cast<char*>(&num), sizeof(int)); // 關閉文件 fb.close(); // 以讀取模式打開文件 fb.open("myfile.txt", std::ios::in); if (!fb.is_open()) { // 打開文件失敗 std::cerr << "Error opening file!" << std::endl; return 1; } // 將文件緩沖區(qū)關聯(lián)到標準輸入流 std::istream in(&fb); // 使用標準輸入流讀取字符串 std::string s; in >> s; std::cout << s << std::endl; // 使用 sgetn() 讀取二進制數(shù)據(jù) fb.sgetn(reinterpret_cast<char*>(&num), sizeof(int)); std::cout << num << std::endl; // 關閉文件 fb.close(); return 0; }
在這個代碼示例中,我們首先使用 filebuf 對象以寫入模式打開了一個文件,然后將文件緩沖區(qū)關聯(lián)到標準輸出流,使用標準輸出流寫入字符串,使用 sputn() 寫入了二進制數(shù)據(jù),最后使用 close() 關閉了文件。然后,我們使用 filebuf 對象以讀取模式打開了同一個文件,將文件緩沖區(qū)關聯(lián)到標準輸入流,使用標準輸入流讀取字符串,使用 sgetn() 讀取了二進制數(shù)據(jù),最后使用 close() 關閉了文件。 請注意,當使用 sputn() 寫入二進制數(shù)據(jù)時,我們需要將要寫入的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個數(shù)據(jù)單元的大小和要寫入的數(shù)據(jù)單元數(shù)。當使用 sgetn() 讀取二進制數(shù)據(jù)時,我們也需要將要讀取的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個數(shù)據(jù)單元的大小和要讀取的數(shù)據(jù)單元數(shù)。希望這些代碼示例能幫助您理解 C++ 中的文件輸入/輸出流的使用方法。
三、文件輸入/輸出流迭代器
你是不是曾經(jīng)有這樣的煩惱,想將數(shù)組或者一堆類型一樣的數(shù)據(jù)寫入文件,for循環(huán)太麻煩。其實,要想簡單有個前提,就是你的數(shù)據(jù)支持迭代器,例如vector這種類型,C++內(nèi)部對其實現(xiàn)了迭代功能(iterator),那么將數(shù)據(jù)一個一個寫入非常方便。
在使用文件輸入/輸出流迭代器之前,你需要先包含下面的頭文件:
#include <fstream> #include <iterator>
然后,你可以使用下面的代碼來寫入數(shù)據(jù)到文件,這段代碼會將 data 中的數(shù)據(jù)寫入到文件 "output.txt" 中,并在每個數(shù)據(jù)之間添加一個空格:
std::ofstream out_file("output.txt"); std::ostream_iterator<int> out_iter(out_file, " "); std::vector<int> data = {1, 2, 3, 4, 5}; std::copy(data.begin(), data.end(), out_iter); out_file.close();
讀取文件中的數(shù)據(jù)也很簡單,可以使用下面的代碼,這段代碼會從文件 "input.txt" 中讀取數(shù)據(jù),并將數(shù)據(jù)存儲在 vector 中。文件輸入/輸出流迭代器很方便,因為它們可以像使用普通迭代器一樣使用,可以很容易地編寫模板代碼。
四、C++ 中的文件輸入/輸出流緩沖區(qū)
首先,你需要包含下面的頭文件:
#include <fstream> #include <iostream>
接下來,你可以使用下面的代碼來寫入數(shù)據(jù)到文件:
std::ofstream out_file("output.txt"); std::streambuf* buf = out_file.rdbuf(); int data = 123; buf->sputn((char*)&data, sizeof(int)); out_file.close();
上面這段代碼會將數(shù)據(jù) 123 寫入到文件 "output.txt" 中。
讀取文件中的數(shù)據(jù)也很簡單,可以使用下面的代碼:
std::ifstream in_file("input.txt"); std::streambuf* buf = in_file.rdbuf(); int data; buf->sgetn((char*)&data, sizeof(int)); in_file.close();
上面這段代碼會從文件 "input.txt" 中讀取一個整數(shù),并將它存儲在變量 data 中。
使用文件輸入/輸出流緩沖區(qū)可以直接操縱底層文件描述符,這使得你可以實現(xiàn)更底層的文件操作。但是,這也意味著你需要自己處理底層細節(jié),比如字節(jié)序轉(zhuǎn)換等等小問題。
五、C++ 中的文件輸入/輸出流預定義的操縱符
頭文件:
#include <fstream> #include <iostream>
接下來,你可以使用下面的代碼來寫入數(shù)據(jù)到文件,這段代碼會將數(shù)據(jù) 123 寫入到文件 "output.txt" 中,并在末尾添加一個換行符。
std::ofstream out_file("output.txt"); int data = 123; out_file << data << std::endl; out_file.close();
你也可以使用 std::flush 操縱符來立即刷新文件輸出緩沖區(qū),例如:
std::ofstream out_file("output.txt"); int data = 123; out_file << data << std::flush; out_file.close();
這段代碼會將數(shù)據(jù) 123 寫入到文件 "output.txt" 中,并立即刷新文件輸出緩沖區(qū)。
這種方法實在喜歡不起來,搞不懂他在干什么,有大神來給我解答一下吧。
六、windows api
windows api寫和讀之前的博客有寫過,先CreateFile然后ReadFile、WriteFile。這個會帶來寬字符問題,具體原因尚不清楚,慎用。貼個鏈接吧。
C++文件相關函數(shù)CreateFile|ReadFile|WriteFile用法詳解
以上就是C++實現(xiàn)將內(nèi)容寫入文件的方法總結(jié)的詳細內(nèi)容,更多關于C++將內(nèi)容寫入文件的資料請關注腳本之家其它相關文章!
相關文章
Qt數(shù)據(jù)庫應用之實現(xiàn)通用數(shù)據(jù)庫采集
這篇文章主要為大家介紹了Qt中是如何實現(xiàn)通用數(shù)據(jù)庫采集的,文中的示例代碼講解詳細,對我們學習Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03解讀C++編程中派生類的構(gòu)成和創(chuàng)建
這篇文章主要介紹了解讀C++編程中派生類的構(gòu)成和創(chuàng)建,是C++入門學習中的基礎知識,需要的朋友可以參考下2015-09-09