在Linux下進行C++文件操作
一、主要問題
- 在CLion中進行C++文件操作的時候發現,沒有direct.h和io.h這兩個頭文件。
二、問題的原因分析
- 無法包含頭文件,兩個原因:要麼就是包含路徑不對,但是如果是系統文件,路徑不應該有問題;那麼就是另外一個原因,系統裏就不應該有這個頭文件,而是用別的方法實現的。
三、解決辦法小結
方案一:找到對應頭文件放在對應路徑
網上提供的大部分方法就是 find + locate + cp,這種方法可能帶來更多的問題,儘量不去手動操作我的系統文件。知戶上這個回答我比較認可,linux下應該是沒有這個頭文件的,而且這個 io.h 應該也不是標準庫。
跟 #include <stdio.h> ,只是頭文件換成了 io.h, 這裏用#include <io.h> 而不是#include “io.h” 說明io.h在編譯器的默認搜索路徑,而不在使用這個#include的文件的工程路徑跟stdio.h不一樣, 這個io.h不是標準C的頭文件。
方案二:使用linux下的頭文件
我程序內用到 direct.h 的地方主要是 mkdir 和 _access 兩處:
- 在win和linux下使用 mkdir 函數需要包含不同的頭文件,注意出入參數的區別。
/ /windows下 _mkdir 函數
#include<direct.h>
int _mkdir( const char *dirname );
// linux下 mkdir 函數
#include <sys/stat.h>
int mkdir(const char *path, mode_t mode);
// 注意輸入輸出,詳見官方文檔
- 在win下和linux下的 _access 方法也不是同一個頭文件,可以利用宏定義解決兼容問題,也可以直接利用不同系統下的函數。
// Windows:
stdio.h , io.h
文件訪問: _access
文件刪除: remove
// Linux:
stdio.h , unistd.h
文件訪問: access
文件刪除: remove
由於不同系統下的函數可能輸入輸出稍有不同,如果不是特別苛求跨平臺,那麼還是直接用相應系統的函數比較方便。
畢竟爲了跨平臺,可能很多用到以上函數的地方都需要判斷系統類型,多出很多工作量。
#if defined(_WIN32) || defined(_WIN64)
// Windows header
// Windows API
#else
// Linux header
// Linux API
#endif
總結一下,能用系統自帶就用系統自帶,能不動系統文件就不動,否則後患無窮。