C++實(shí)現(xiàn)將內(nèi)容寫入文件的方法總結(jié)
一、C語(yǔ)言輸出內(nèi)容到文件
使用 C 的文件 I/O 函數(shù),例如 fopen(),fprintf(),fputs() 和 fwrite() 等。這些函數(shù)由 C 語(yǔ)言中的標(biāo)準(zhǔn)庫(kù) 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() 寫入二進(jìn)制數(shù)據(jù) int num = 42; fwrite(&num, sizeof(int), 1, fp); // 關(guān)閉文件 fclose(fp); return 0; }
在這個(gè)代碼示例中,我們首先使用 fopen() 函數(shù)以寫入模式打開了一個(gè)文件,然后使用 fprintf(),fputs() 和 fwrite() 向文件寫入了字符串和二進(jìn)制數(shù)據(jù),最后使用 fclose() 函數(shù)關(guān)閉了文件。請(qǐng)注意,在使用 fwrite() 函數(shù)寫入二進(jìn)制數(shù)據(jù)時(shí),我們需要提供要寫入的數(shù)據(jù)的指針,以及每個(gè)數(shù)據(jù)單元的大小和要寫入的數(shù)據(jù)單元數(shù)。
二、C++文件輸入/輸出流
此種是C++標(biāo)準(zhǔn)的輸入輸出,一般不會(huì)帶來(lái)字符種類不同引發(fā)的問(wèn)題,比如寬字節(jié)和窄字節(jié)之間的區(qū)別,肯能我們打開文件內(nèi)容都一樣,但是涉及加密、編碼等操作寬窄字符是有區(qū)別的,這個(gè)是有教訓(xùn)的,牢記。
下面是使用 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() 寫入二進(jìn)制數(shù)據(jù) int num = 42; out.write(reinterpret_cast<char*>(&num), sizeof(int)); // 關(guān)閉文件 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() 讀取二進(jìn)制數(shù)據(jù) in.read(reinterpret_cast<char*>(&num), sizeof(int)); std::cout << num << std::endl; // 關(guān)閉文件 in.close(); return 0; }
在這個(gè)代碼示例中,我們首先使用 ofstream 對(duì)象以寫入模式打開了一個(gè)文件,然后使用流操作符 << 向文件寫入了字符串,使用 write() 寫入了二進(jìn)制數(shù)據(jù),最后使用 close() 關(guān)閉了文件。然后,我們使用 ifstream 對(duì)象以讀取模式打開了同一個(gè)文件,使用流操作符 >> 讀取了字符串,使用 read()讀取了二進(jìn)制數(shù)據(jù),最后使用 close() 關(guān)閉了文件。
請(qǐng)注意,當(dāng)使用 write() 寫入二進(jìn)制數(shù)據(jù)時(shí),我們需要將要寫入的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個(gè)數(shù)據(jù)單元的大小和要寫入的數(shù)據(jù)單元數(shù)。當(dāng)使用 read() 讀取二進(jìn)制數(shù)據(jù)時(shí),我們也需要將要讀取的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個(gè)數(shù)據(jù)單元的大小和要讀取的數(shù)據(jù)單元數(shù)。
另一個(gè) C++ 標(biāo)準(zhǔn)庫(kù)中的文件輸入/輸出流類型叫做 filebuf,它可以通過(guò)標(biāo)準(zhǔn)輸入/輸出流來(lái)讀寫文件。例如,下面是使用 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ū)關(guān)聯(lián)到標(biāo)準(zhǔn)輸出流 std::ostream out(&fb); // 使用標(biāo)準(zhǔn)輸出流寫入字符串 out << "Hello, world!" << std::endl; out << "This is another string." << std::endl; // 使用 sputn() 寫入二進(jìn)制數(shù)據(jù) int num = 42; fb.sputn(reinterpret_cast<char*>(&num), sizeof(int)); // 關(guān)閉文件 fb.close(); // 以讀取模式打開文件 fb.open("myfile.txt", std::ios::in); if (!fb.is_open()) { // 打開文件失敗 std::cerr << "Error opening file!" << std::endl; return 1; } // 將文件緩沖區(qū)關(guān)聯(lián)到標(biāo)準(zhǔn)輸入流 std::istream in(&fb); // 使用標(biāo)準(zhǔn)輸入流讀取字符串 std::string s; in >> s; std::cout << s << std::endl; // 使用 sgetn() 讀取二進(jìn)制數(shù)據(jù) fb.sgetn(reinterpret_cast<char*>(&num), sizeof(int)); std::cout << num << std::endl; // 關(guān)閉文件 fb.close(); return 0; }
在這個(gè)代碼示例中,我們首先使用 filebuf 對(duì)象以寫入模式打開了一個(gè)文件,然后將文件緩沖區(qū)關(guān)聯(lián)到標(biāo)準(zhǔn)輸出流,使用標(biāo)準(zhǔn)輸出流寫入字符串,使用 sputn() 寫入了二進(jìn)制數(shù)據(jù),最后使用 close() 關(guān)閉了文件。然后,我們使用 filebuf 對(duì)象以讀取模式打開了同一個(gè)文件,將文件緩沖區(qū)關(guān)聯(lián)到標(biāo)準(zhǔn)輸入流,使用標(biāo)準(zhǔn)輸入流讀取字符串,使用 sgetn() 讀取了二進(jìn)制數(shù)據(jù),最后使用 close() 關(guān)閉了文件。 請(qǐng)注意,當(dāng)使用 sputn() 寫入二進(jìn)制數(shù)據(jù)時(shí),我們需要將要寫入的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個(gè)數(shù)據(jù)單元的大小和要寫入的數(shù)據(jù)單元數(shù)。當(dāng)使用 sgetn() 讀取二進(jìn)制數(shù)據(jù)時(shí),我們也需要將要讀取的數(shù)據(jù)的指針轉(zhuǎn)換為 char* 類型,并提供每個(gè)數(shù)據(jù)單元的大小和要讀取的數(shù)據(jù)單元數(shù)。希望這些代碼示例能幫助您理解 C++ 中的文件輸入/輸出流的使用方法。
三、文件輸入/輸出流迭代器
你是不是曾經(jīng)有這樣的煩惱,想將數(shù)組或者一堆類型一樣的數(shù)據(jù)寫入文件,for循環(huán)太麻煩。其實(shí),要想簡(jiǎn)單有個(gè)前提,就是你的數(shù)據(jù)支持迭代器,例如vector這種類型,C++內(nèi)部對(duì)其實(shí)現(xiàn)了迭代功能(iterator),那么將數(shù)據(jù)一個(gè)一個(gè)寫入非常方便。
在使用文件輸入/輸出流迭代器之前,你需要先包含下面的頭文件:
#include <fstream> #include <iterator>
然后,你可以使用下面的代碼來(lái)寫入數(shù)據(jù)到文件,這段代碼會(huì)將 data 中的數(shù)據(jù)寫入到文件 "output.txt" 中,并在每個(gè)數(shù)據(jù)之間添加一個(gè)空格:
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ù)也很簡(jiǎn)單,可以使用下面的代碼,這段代碼會(huì)從文件 "input.txt" 中讀取數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在 vector 中。文件輸入/輸出流迭代器很方便,因?yàn)樗鼈兛梢韵袷褂闷胀ǖ饕粯邮褂?,可以很容易地編寫模板代碼。
四、C++ 中的文件輸入/輸出流緩沖區(qū)
首先,你需要包含下面的頭文件:
#include <fstream> #include <iostream>
接下來(lái),你可以使用下面的代碼來(lái)寫入數(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();
上面這段代碼會(huì)將數(shù)據(jù) 123 寫入到文件 "output.txt" 中。
讀取文件中的數(shù)據(jù)也很簡(jiǎn)單,可以使用下面的代碼:
std::ifstream in_file("input.txt"); std::streambuf* buf = in_file.rdbuf(); int data; buf->sgetn((char*)&data, sizeof(int)); in_file.close();
上面這段代碼會(huì)從文件 "input.txt" 中讀取一個(gè)整數(shù),并將它存儲(chǔ)在變量 data 中。
使用文件輸入/輸出流緩沖區(qū)可以直接操縱底層文件描述符,這使得你可以實(shí)現(xiàn)更底層的文件操作。但是,這也意味著你需要自己處理底層細(xì)節(jié),比如字節(jié)序轉(zhuǎn)換等等小問(wèn)題。
五、C++ 中的文件輸入/輸出流預(yù)定義的操縱符
頭文件:
#include <fstream> #include <iostream>
接下來(lái),你可以使用下面的代碼來(lái)寫入數(shù)據(jù)到文件,這段代碼會(huì)將數(shù)據(jù) 123 寫入到文件 "output.txt" 中,并在末尾添加一個(gè)換行符。
std::ofstream out_file("output.txt"); int data = 123; out_file << data << std::endl; out_file.close();
你也可以使用 std::flush 操縱符來(lái)立即刷新文件輸出緩沖區(qū),例如:
std::ofstream out_file("output.txt"); int data = 123; out_file << data << std::flush; out_file.close();
這段代碼會(huì)將數(shù)據(jù) 123 寫入到文件 "output.txt" 中,并立即刷新文件輸出緩沖區(qū)。
這種方法實(shí)在喜歡不起來(lái),搞不懂他在干什么,有大神來(lái)給我解答一下吧。
六、windows api
windows api寫和讀之前的博客有寫過(guò),先CreateFile然后ReadFile、WriteFile。這個(gè)會(huì)帶來(lái)寬字符問(wèn)題,具體原因尚不清楚,慎用。貼個(gè)鏈接吧。
C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解
以上就是C++實(shí)現(xiàn)將內(nèi)容寫入文件的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C++將內(nèi)容寫入文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言程序設(shè)計(jì)之指針的應(yīng)用詳解
為了讓大家能夠更準(zhǔn)確的了解C語(yǔ)言中指針的使用,本文為大家準(zhǔn)備了四個(gè)指針相關(guān)的例題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2022-11-11c語(yǔ)言在控制臺(tái)判定鼠標(biāo)左鍵的小例子
c語(yǔ)言在控制臺(tái)判定鼠標(biāo)左鍵的小例子,需要的朋友可以參考一下2013-06-06VC基于ADO技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了VC基于ADO技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)的方法,較為詳細(xì)的分析了VC使用ADO操作數(shù)據(jù)庫(kù)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10C語(yǔ)言Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫
iniparser是針對(duì)INI文件的解析器。ini文件則是一些系統(tǒng)或者軟件的配置文件。本文就來(lái)介紹一下如何利用Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫吧2023-03-03c++詳細(xì)講解構(gòu)造函數(shù)的拷貝流程
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對(duì)象時(shí),是使用同一類中之前創(chuàng)建的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象??截悩?gòu)造函數(shù)通常用于:通過(guò)使用另一個(gè)同類型的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象。?復(fù)制對(duì)象把它作為參數(shù)傳遞給函數(shù)。復(fù)制對(duì)象,并從函數(shù)返回這個(gè)對(duì)象2022-05-05Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)采集
這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)采集的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03解讀C++編程中派生類的構(gòu)成和創(chuàng)建
這篇文章主要介紹了解讀C++編程中派生類的構(gòu)成和創(chuàng)建,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09