???文章的目的為了記錄使用C語言進行linux?開發學習的經歷。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。
?相關鏈接:
linux C 語言開發 (一) Window下用gcc編譯和gdb調試
linux C 語言開發 (二) VsCode遠程開發 linux
linux C 語言開發 (三) 建立云服務器
linux C 語言開發 (四) linux系統常用命令
linux C 語言開發 (五) linux系統目錄結構
linux C 語言開發 (六) 程序的編輯和編譯(vim、gcc)
linux C 語言開發 (七) 文件 IO 和標準 IO
linux C 語言開發 (八) 進程基礎
linux C 語言開發 (九) 進程間通訊--管道
linux C 語言開發 (十) 進程間通訊--信號
Linux C到Android App開發推薦鏈接(入門十二章):
開源 java android app 開發(一)開發環境的搭建_csdn 開源 java android app-CSDN博客
開源 java android app 開發(一)開發環境的搭建-CSDN博客
開源 java android app 開發(二)工程文件結構-CSDN博客
開源 java android app 開發(三)GUI界面布局和常用組件-CSDN博客
開源 java android app 開發(四)GUI界面重要組件-CSDN博客
開源 java android app 開發(五)文件和數據庫存儲-CSDN博客
開源 java android app 開發(六)多媒體使用-CSDN博客
開源 java android app 開發(七)通訊之Tcp和Http-CSDN博客
開源 java android app 開發(八)通訊之Mqtt和Ble-CSDN博客
開源 java android app 開發(九)后臺之線程和服務-CSDN博客
開源 java android app 開發(十)廣播機制-CSDN博客
開源 java android app 開發(十一)調試、發布-CSDN博客
開源 java android app 開發(十二)封庫.aar-CSDN博客
linux C到.net mvc開發推薦鏈接:
開源C# .net mvc 開發(一)WEB搭建_c#部署web程序-CSDN博客
開源 C# .net mvc 開發(二)網站快速搭建_c#網站開發-CSDN博客
開源 C# .net mvc 開發(三)WEB內外網訪問(VS發布、IIS配置網站、花生殼外網穿刺訪問)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客
開源 C# .net mvc 開發(四)工程結構、頁面提交以及顯示_c#工程結構-CSDN博客
開源 C# .net mvc 開發(五)常用代碼快速開發_c# mvc開發-CSDN博客
主要內容:講述linux中的文件IO和標準IO的區別
目錄:
1.基本介紹
2.函數介紹
3.綜合代碼
4.效果演示
一、基本介紹
文件 IO 是 Linux 系統提供的接口, 針對文件和磁盤進行操作, 不帶緩存機制; 標準 IO 是 C 語言函數庫里的標準 I/O 模型, 在 stdio.h 中定義, 通過緩沖區操作文件, 帶緩存機制。 Linux 系統中一切皆文件, 包括普通文件, 目錄, 設備文件(不包含網絡設備) , 管道, fifio 隊列, socket 套接字等, 在終端輸入“ls -l”可查看文件類型和權限。
標準 IO 和文件 IO 常用 API 如下:
標準 IO | 文件 IO | |
打開/創建 | fopen | open |
讀 | getc,fgetc,getchar,fgets,gets, fread | read |
寫 | putc,fputc,putc,fputs,puts, fwrite | write |
關閉 | fclose | close |
區別圖展示
文件 IO 是直接調用內核提供的系統調用函數(linux), 頭文件是 unistd.h, 標準 IO 是間接調用系統調用函數(系統都可以),頭文件是 stdio.h,
?
二、函數介紹
open
函數 | int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t mode) |
頭文件 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> |
參數 pathname | 路徑和文件名 |
參數 flags | 文件打開方式, 可用多個標志位按位或設置 |
參數 mode | 權限掩碼, 對不同用戶和組設置可執行, 讀, 寫權限, 使用八進制數表示, 此參數可不寫 |
返回值 | open()執行成功會返回 int 型文件描述符, 出錯時返回-1。 |
作用 | 通過系統調用, 可以打開文件, 并返回文件描述符 |
read
函數 | ssize_t read(int fd, void *buf, size_t count) |
頭文件 | #include <unistd.h> |
參數 fd | 要讀的文件描述符 |
參數 buf | 緩沖區, 存放讀到的內容 |
參數 count | 每次讀取的字節數 |
返回值 | 返回值大于 0, 表示讀取到的字節數;等于 0 在阻塞模式下表示到達文件末尾或沒有數據可讀(EOF) , 并調用阻塞;等于-1 表示出錯, 在非阻塞模式下表示沒有數據可讀。 |
write
函數 | ssize_t write(int fd, const void *buf, size_t count); |
頭文件 | #include <unistd.h> |
參數 fd | 文件描述符; |
參數 buf | 緩存區, 存放將要寫入的數據 |
參數 count | 每次寫入的個數 |
功能 | 每次從 buf 緩存區拿 count 個字節寫入 fd 文件。 |
返回值 | 大于或等于 0 表示執行成功, 返回寫入的字節數;返回-1 代表出錯 |
close
函數 | int close(int fd) |
頭文件 | #include <unistd.h> |
參數 fd | 文件描述符 |
返回值 | 成功返回 0; 錯誤返回-1 |
三、綜合代碼
功能:打開文件1和文件2,如果文件1不為空,將文件1的前32個字符寫入文件2,最后關閉。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
//步驟一: 判斷命令行的參數
if(argc != 3)
{
printf("Usage:%s <src file> <obj file>\n", argv[0]);
}
// 步驟二: 定義變量
int fd_src;
int fd_obj;
char buf[32] = {0};
ssize_t ret;
// 步驟三: 打開文件獲得文件描述符
fd_src = open(argv[1], O_RDWR);
if (fd_src < 0)
{
printf("open is error\n");
return -1;
}
fd_obj = open(argv[2], O_CREAT | O_RDWR, 0666);
if (fd_obj < 0)
{
printf("open is error\n");
return -2;
}
// 步驟四: 讀寫操作
while((ret=read(fd_src,buf,32))!=0)
{
write(fd_obj,buf,ret);
}
// 步驟五: 關閉文件描述符
close(fd_src);
close(fd_obj);
return 0;
}
四、實際效果
編譯文件
運行main,1.txt的內容拷貝到2.txt。