關於linux和win下的文件操作函數小問題

在Linux下進行C++文件操作


一、主要問題

  1. 在CLion中進行C++文件操作的時候發現,沒有direct.hio.h這兩個頭文件。

二、問題的原因分析

  1. 無法包含頭文件,兩個原因:要麼就是包含路徑不對,但是如果是系統文件,路徑不應該有問題;那麼就是另外一個原因,系統裏就不應該有這個頭文件,而是用別的方法實現的。

三、解決辦法小結

方案一:找到對應頭文件放在對應路徑

網上提供的大部分方法就是 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 兩處:

  1. 在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);
// 注意輸入輸出,詳見官方文檔
  1. 在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

總結一下,能用系統自帶就用系統自帶,能不動系統文件就不動,否則後患無窮。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章