1. 程式人生 > >Linux系統程式設計學習筆記(1)-檔案的I/O操作

Linux系統程式設計學習筆記(1)-檔案的I/O操作

概述

在Linux系統下,通常以一個非負整數來代指一個開啟的檔案,這些檔案可以包括終端,socket,裝置,普通檔案等等。規定的三個標準的檔案描述符為0,1,2下面分別介紹(在互動式shell中,這些檔案描述符通常指向shell執行所在的終端):

  • 檔案描述符0:
    用途:標準輸入
    POSIX名稱: STDIN_FILENO

  • 檔案描述符1:
    用途:標準輸出
    POSIX名稱STDOUT_FILENO

  • 檔案描述符2
    用途:標準錯誤
    POSIX名稱:STDERR_FILENO
    注:推薦使用

常用的標準函式

fd = open(pathname,flags,mode)

fd即為檔案描述符, flags引數指定了檔案的開啟方式,mode指定了建立檔案的訪問許可權,若open函式沒有建立檔案,則此引數可以忽略。

numread = read(fd, buffer,count)

從檔案描述符fd所指代的檔案中讀取count個數據到buffer中,返回值即為讀取到的位元組數。

numwritten = write(fd,buffer,count)

與read函式類似

status = close(fd)

輸入與輸出操作完成之後,呼叫次函式以釋放資源。

一個簡單的I/O操作如下,實現了對檔案內容的複製:

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h> #ifndef BUF_SIZE #define BUF_SIZE 1024 #endif using namespace std; int main(int argc, char *argv[]) { int inputFd, outputFd, openFlags; mode_t filePerms; ssize_t numRead; char buf[BUF_SIZE]; /*確保在終端輸入了正確的檔案路徑*/ if (argc != 3 || strcmp(argv[1], "--help") == 0) cout
<<"param error??"<<endl; /*開啟輸入檔案*/ inputFd = open(argv[1], O_RDWR); if (inputFd == -1) cout<<"open file"<<argv[1]<<"failed!!"<<endl; openFlags = O_CREAT | O_WRONLY | O_TRUNC; filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; /*開啟輸出檔案*/ outputFd = open(argv[2], openFlags, filePerms); if(outputFd == -1) cout<<"open file"<<argv[2]<<"failed!!"<<endl; /*複製檔案內容*/ while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0) if (write(outputFd, buf, numRead) != numRead) cout<<"couldnot wrire whole buffer"<<endl; if (numRead == -1) cout<<"read wrong!!"<<endl; /*關閉兩個檔案*/ if (close(inputFd) == -1) cout<<"can not close input file!!"<<endl; if (close(outputFd) == -1) cout<<"can not close output file!!"<<endl; return 0; }
g++ main.cpp -o io_test

好玩的是,例如下面的命令:

./io_test /dev/tty a.txt 

會接受開啟程式之後使用者在終端的輸入,知道使用Ctrl+c結束程式之前,使用者的輸入會一直記錄到a.txt當中。反之亦然。

open函式

fd = open(pathname,flags,mode)

mode引數只在建立新檔案時有用,主要有以下幾個引數可供選擇:

  • O_RDONLY:只讀方式開啟檔案
  • O_WRONLY:只寫方式開啟檔案
  • O_RDWR: 讀寫方式開啟檔案

flags引數較多且經常使用,下面介紹各種引數的用途:

  1. O_RDONLY:只讀方式開啟
  2. O_WRONLY:只寫方式開啟
  3. O_RDWR:讀寫方式開啟
  4. O_CREAT:若檔案不存在則建立,注意要加入mode引數
  5. O_DIRECT:無緩衝的輸入輸出
  6. O_DIRECTORY:若pathname不是檔案目錄則失敗
  7. O_EXCL:結合O_CREAT引數使用,用於建立檔案,若檔案已經存在,則不會開啟檔案且報錯
  8. O_NOATIME:讀取檔案時,不修改最近訪問時間
  9. O_NOCTTY:不讓pathname所指向的檔案成為控制終端
  10. O_NOFOLLOW:對符號連結不予解引用
  11. O_TRUNC:截斷已有檔案,使其長度為0
  12. O_APPEND:總在檔案末尾追加資料
  13. O_NONBLOCK:以非阻塞方式開啟
  14. O_SYNC:以同步方式開啟檔案

read()函式

read函式從檔案描述符代指的檔案中讀取資料。buffer引數通過用來存放輸入資料的記憶體緩衝區地址。read成功將返回讀取的位元組數。當然也可以使用上述提到的標準檔案描述符,直接從終端讀取資料

numread = read(STDIN_FILENO, buffer, MAX_READ)

注意,由於直接從終端讀取,讀取的資料型別不確定,read函式無法在讀取的資料末尾加上結尾字元’\0’,因此需要人為新增

buffer[numread] = '\0'

才能正確顯示輸入的資料。

改變檔案偏移量

off_t lseek(int fd, offt_t offset, int whence)

off_t資料型別為有符號整數型,whence引數表明依照哪個基點來結束offset引數

  • SEET_SET:檔案頭部
  • SEET_CUR:當前檔案偏移量
  • SEET_END:檔案尾部,offset引數從檔案最後一個位元組的下一個位元組開始

列印錯誤資訊

採用linux系統讀寫函式時,經常出現檔案不存在或者訪問許可權的問題,要知道出現的是什麼錯誤,可以使用perror函式

perror(string)

這個函式可以列印上一次函式的錯誤資訊,string主要為了顯示錯誤的同時顯示一些描述性的資訊

相關推薦

Linux系統程式設計學習筆記1-檔案I/O操作

概述 在Linux系統下,通常以一個非負整數來代指一個開啟的檔案,這些檔案可以包括終端,socket,裝置,普通檔案等等。規定的三個標準的檔案描述符為0,1,2下面分別介紹(在互動式shell中,這些檔案描述符通常指向shell執行所在的終端): 檔案描述

linux 監控效能學習筆記1

 top命令中的 load average後面的三個數字分別表示距離現在一分鐘,五分鐘,十五分鐘的負載情況。   在單核系統中100%利用負載標識為1.00,雙核系統標識2.00 四核系統標識為4.00 因此,有一個 14 load average值和 24個 核心的負載

linux網路程式設計學習筆記

目錄 1. 獲取系統呼叫錯誤資訊:errno   strerror()     perror(); 他跟c語言中的fopen()有什麼區別呢?  他也呼叫的是這個open(); 2.常規檔案操作之建立、讀、寫

Linux網路程式設計學習筆記7---5種I/O模型及select輪詢

本文主要介紹5種I/O模型,select函式以及利用select實現C/S模型。 1、5種I/O模型 (1)阻塞I/O: 一直等到資料到來,才會將資料從核心中拷貝到使用者空間中。 (2)非阻塞I/O: 每過一段時

shell程式設計學習筆記1

接觸到linux已經有2-3年了,一些基本的命令用的還算很熟,但一直沒有系統的對linux進行學習,可以說學的的很零散,遇到問題一般通過網路也能找到答案。 最近突然不忙了,想系統的學習一下shell程式設計。可以說對linux的熟悉離不開對shell的學習,而作為一個好的系

R語言學習筆記,1基礎及向量操作

一、基礎部分(持續更新) 1、大小寫明感 2、source(“d:/test.R”):可以執行對應目錄下得test.R指令碼。R中\符號為轉義字元,所有目錄中需使用/或者\\.。 3、sink(“d:/out.txt”):將後續的輸出由終端轉向一個外部檔案,本例中為d;/o

java學習筆記9-Java I/O系統

第九章 Java I/O系統 1、題目 1.1、 何為流?根據流的方向,流可分為哪兩種? 流表示檔案傳播的方向和傳播的檔案資訊的集合。根據流的方向,流可分為輸入與輸出流。 PPT:流是在計算機的輸入、輸出操作中流動的資料序列。 1.2、 I

【鳥叔的Linux私房菜】學習筆記1——Linux系統入門

雖然現在工作一直在用Xshell 一些 基本的命令、常用的還可以, 但總感覺對Linux瞭解的知之甚少,偶爾改個檔案還需要請教同事,真是慚愧。 所以決定從今天開始重新學習下Linux,查漏補缺,並將學習的結果作為筆記和大家一塊交流和進步,就開始我們今天的學習吧。 一

bootstrap 學習筆記1---介紹bootstrap和柵格系統

優先 cal 圖片 應用 尺寸 文件中 lin png ice   學習前端許久,對於布置框架和響應瀏覽器用html 和javascript 寫的有點繁瑣,無意間看到這個框架,覺得挺好用的就開始學習了,但是這個框架上面有很多知識,不是所有的都要學的,故將學習筆記和覺得重點的

linux學習筆記1

1 linux之父是linus Torvalds(李納斯 托沃滋),1991年他在赫爾辛基大學讀書時自己手動寫了一個電腦操作系統,取名linux,並且公布了源代碼。 C語言之父是Dennis M Ritchie(丹尼斯 裏奇)。 JAVA之父是詹姆斯高斯林,出生在加拿大,他編寫了多處理器版本的unix操

Linux第三周學習筆記1

命令 hiho 並且 ron 增加 如果 mkdir strong lin Linux第三周學習筆記(1)2.20 特殊權限stick_bit特殊權限stick_bit:意為防刪除位。文件是否可以被某一個用戶刪除,主要取決於該文件所在目錄是否對該用戶具有寫的權限。如果沒有寫

linux高性能編程學習筆記1

linuxTCP/TP協議族:分層、多協議的通信體系,四層協議系統,自底向上:數據鏈路層、網絡層、傳輸層、應用層數據鏈路層:實現網卡接口的網絡驅動程序,以處理數據在物理媒介上得到傳輸數據鏈路層兩個常用的協議:ARP協議(地址解析協議)、RARP協議(逆地址解析協議)網絡層:實現數據包的選路和轉發網絡層最核心的

Linux學習筆記1linux的開關機及重啟

baidu 方式 圖形界面 class bsp har boot init5 ida linux的啟動流程 一、啟動 (1)電源 開關   (2)選擇啟動方式:FLOPPY/BIOS/CDROM(軟盤/bios啟動/光盤) 基於MBR引導方式 【1】MBR:最多只能劃分4

程式設計藝術學習筆記1

序言習題 (1).通過一系列的替代,將四個變數的值(a,b,c,d)變為(b,c,d,a),用最少的步驟 開門菜,然而還是有很多值得思考的地方。能幫助人理解計算機對於賦值的操作。通過觀察,可以認為這是一個a[i]賦值給a[i-1]的操作。最少的步驟,只需要五步即可。需要一個t來作輔助

Vue學習筆記1——在頁面右上角實現可懸浮/隱藏的系統選單

轉自榕樹島 本文不能算一個教程,而是記錄一隻Vue菜鳥踩坑心路歷程的筆記,對於正在踩坑的新手或許會有一點小幫助。作為第一篇正經八百的技術部落格,歡迎大家發表看法,關愛菜鳥,請輕拍 很久以後回來更一下,這個功能可以用Vuex輕鬆搞定,此文就當練習父子元件通訊了吧,emmm…… 原文: 這是個

Kafka學習筆記1----Kafka的簡介和Linux下單機安裝

1. Kafka簡介   Kafka is a distributed,partitioned,replicated commit logservice。它提供了類似於JMS的特性,但是在設計實現上完全不同,此外它並不是JMS規範的實現。kafka對訊息儲存時根據Topic進行歸類,傳送訊息者成為Produ

Javascript高階程式設計學習筆記—— JS中的資料型別1

 前一段時間由於事情比較多,所以筆記耽擱了一段時間,從這一篇開始我會盡快寫完這個系列。 文章中有什麼不足之處,還望各位大佬指出。 JS中的資料型別 上一篇中我寫了有關JS引入的Script標籤相關的東西。 那麼這一篇,我們可以正式進入JS的世界了,emmm 前面的東西應該比較基礎,大佬們不

linux學習筆記1linux基礎知識

1.linux是什麼? Linux這個詞本身只表示Linux核心,但實際上人們已經習慣了用Linux來形容整個基於Linux核心,並且使用GNU 工程各種工具和資料庫的作業系統。 2. 什麼是shell 保護系統核心並對外提供操作介面的軟體 在linux中預設的

Javascript高階程式設計學習筆記12—— 引用型別1Object型別

前面的文章中我們知道JS中的值分為兩種型別 基礎型別的值和引用型別的值 基礎型別的值我已經大概介紹了一下,今天開始後面幾天我會為大家介紹一下引用型別的值   Object型別 物件是引用型別的值的例項,在ECMA中引用型別是一種資料結構 用於將資料和功能組織到一起,在其它程式語言中通常也

資料庫課設圖書管理系統學習筆記1

圖書館課課設圖片插入,讀出 BufferedImage: 所述BufferedImage亞類描述了一種Image與影象資料的訪問的緩衝器。 A BufferedImage由影象資料的ColorModel和Raster組成。 SampleModel中SampleModel中的Raster的