寫文件有三種模式: 截斷寫,文件打開之後立即清空原有內容 附加寫,文件打開之後不清空原有內容,每次只能在文件最後寫入 覆蓋寫,文件打開之後不清空原有內容,可以在文件任意位置寫入 例如:文件原有內容為 123456,在開始位置覆蓋寫入 abcd,最後文件內容為 abcd56。首先使用下麵的代碼進行嘗試 ...
寫文件有三種模式:
- 截斷寫,文件打開之後立即清空原有內容
- 附加寫,文件打開之後不清空原有內容,每次只能在文件最後寫入
- 覆蓋寫,文件打開之後不清空原有內容,可以在文件任意位置寫入
例如:文件原有內容為 123456
,在開始位置覆蓋寫入 abcd
,最後文件內容為 abcd56
。首先使用下麵的代碼進行嘗試:
#include <fstream>
int main()
{
std::ofstream ofile("test.txt");
ofile << "abcd";
}
輸出的結果為 abcd
,原有內容被截斷了。可是並沒有設置 std::ios::trunc
標誌。ofstream
預設只設置了 std::ios::out
。查閱 std::basic_filebuf<CharT,Traits>::open 發現單獨的 std::ios::out
和 std::ios::out | std::ios::trunc
等價。想要在不設置 std::ios::trunc
或 std::ios::app
的情況下設置 std::ios::out
,只能使用 std::ios::in | std::ios::out
。因此修改代碼為:
#include <fstream>
int main()
{
std::ofstream ofile("test.txt", std::ios::in);
ofile << "abcd";
}
成功輸出 abcd56
。覆蓋寫並沒有被 C/C++ 標準直接支持,因此只能藉助這種奇怪的組合實現。在底層的 Linux 有更直接的辦法:
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd = open("test.txt", O_WRONLY);
write(fd, "abcd", 4);
close(fd);
}
這段代碼只用了簡單的 O_WRONLY
標誌,就實現了覆蓋寫。
本文來自博客園,作者:mkckr0,轉載請註明原文鏈接:https://www.cnblogs.com/mkckr0/p/16224260.html