久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 標準IO 中對(dui)文件的基本操(cao)作

標準IO 中對文(wen)件的(de)基本操作 時間(jian):2018-01-09      來源:未知

對于Linux程(cheng)序員來說,對文件的(de)IO操作(zuo)是應用(yong)編程(cheng)的(de)基礎內容(rong),也是必(bi)須掌握(wo)的(de)技(ji)能;下面作(zuo)者(zhe)通過兩個(ge)基本(ben)概(gai)念(nian)和四(si)個(ge)函數,來解析對文件的(de)基本(ben)操作(zuo);

首先要明白兩個基本的概念;文件和IO;

1.文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian):文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)指的是(shi)(shi)同類型(xing)數據的集合; 在(zai)linux中(zhong)有(you)一個重要(yao)思(si)想;一切皆文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian);也是(shi)(shi)說在(zai)Linux系統中(zhong)把所有(you)的文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)、設備(bei)、內存等(deng)都當做文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)來看待(dai);因為(wei)這個思(si)想的存在(zai),所有(you)在(zai)Linux系統中(zhong)對設備(bei)及文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)的操作方式都是(shi)(shi)一樣的。Linux中(zhong)把文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)分(fen)為(wei)七種類型(xing),分(fen)別是(shi)(shi)普通文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)、設備(bei)文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)(塊設備(bei)和字(zi)符設備(bei))、目錄(lu)文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)、管道文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)、鏈(lian)接(jie)(jie)文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)(符號鏈(lian)接(jie)(jie)文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)),套接(jie)(jie)字(zi);我們主(zhu)要(yao)以(yi)普通文(wen)(wen)(wen)件(jian)(jian)(jian)(jian)(jian)(jian)來學習;

2. IO: IO是input和(he)output的(de)(de)(de)(de)簡寫,也就(jiu)(jiu)是指(zhi)的(de)(de)(de)(de)輸(shu)(shu)(shu)入(ru)和(he)輸(shu)(shu)(shu)出(chu)(chu);對于Linux系統(tong)來(lai)講;輸(shu)(shu)(shu)入(ru)及(ji)輸(shu)(shu)(shu)出(chu)(chu)主要是從(cong)程(cheng)序(xu)的(de)(de)(de)(de)角度來(lai)看的(de)(de)(de)(de),因為程(cheng)序(xu)員的(de)(de)(de)(de)主要的(de)(de)(de)(de)工作就(jiu)(jiu)是使用程(cheng)序(xu)來(lai)處理(li)數(shu)(shu)(shu)據(ju); 所以(yi)(yi)輸(shu)(shu)(shu)入(ru)指(zhi)的(de)(de)(de)(de)就(jiu)(jiu)是把(ba)數(shu)(shu)(shu)據(ju)輸(shu)(shu)(shu)入(ru)到程(cheng)序(xu)中(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)(zhong),輸(shu)(shu)(shu)出(chu)(chu)值(zhi)指(zhi)的(de)(de)(de)(de)是從(cong)程(cheng)序(xu)中(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)輸(shu)(shu)(shu)出(chu)(chu)數(shu)(shu)(shu)據(ju);一般情況下,輸(shu)(shu)(shu)入(ru)主要使用鍵(jian)盤(pan),鍵(jian)盤(pan)也叫標(biao)(biao)準(zhun)(zhun)輸(shu)(shu)(shu)入(ru),而輸(shu)(shu)(shu)出(chu)(chu)的(de)(de)(de)(de)結果(guo)主要顯(xian)示(shi)在屏(ping)幕(mu)上,屏(ping)幕(mu)也就(jiu)(jiu)是標(biao)(biao)準(zhun)(zhun)輸(shu)(shu)(shu)出(chu)(chu);除了標(biao)(biao)準(zhun)(zhun)輸(shu)(shu)(shu)入(ru)和(he)標(biao)(biao)準(zhun)(zhun)輸(shu)(shu)(shu)出(chu)(chu)外,還有一個標(biao)(biao)準(zhun)(zhun)文件(jian)——標(biao)(biao)準(zhun)(zhun)錯誤輸(shu)(shu)(shu)出(chu)(chu),它指(zhi)的(de)(de)(de)(de)是當(dang)程(cheng)序(xu)與運行或(huo)出(chu)(chu)錯時,結果(guo)也會顯(xian)示(shi)到屏(ping)幕(mu)上; 實際中(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)(zhong),我(wo)們(men)(men)的(de)(de)(de)(de)數(shu)(shu)(shu)據(ju)輸(shu)(shu)(shu)入(ru)并不(bu)一定(ding)要從(cong)鍵(jian)盤(pan)中(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)輸(shu)(shu)(shu)入(ru),輸(shu)(shu)(shu)出(chu)(chu)也不(bu)是只能(neng)輸(shu)(shu)(shu)出(chu)(chu)到屏(ping)幕(mu)上;我(wo)們(men)(men)可以(yi)(yi)從(cong)文件(jian)、內存中(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)輸(shu)(shu)(shu)入(ru)數(shu)(shu)(shu)據(ju)到程(cheng)序(xu),也可以(yi)(yi)從(cong)程(cheng)序(xu)中(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)輸(shu)(shu)(shu)出(chu)(chu)數(shu)(shu)(shu)據(ju)到文件(jian)及(ji)內存中(zhong)(zhong)(zhong)(zhong)(zhong)(zhong)(zhong);

在此文中,輸入/輸出都是對文件而言;

了(le)(le)(le)解上(shang)面兩(liang)個概念的有什么(me)作用呢?作用就是(shi)你了(le)(le)(le)解了(le)(le)(le)我們操作對(dui)(dui)象是(shi)——文(wen)件(jian);同時(shi)了(le)(le)(le)解對(dui)(dui)文(wen)件(jian)進行的操作——數據的輸(shu)入及輸(shu)出;

那么,我(wo)們操作文件的(de)一般思路(lu)是什(shen)么?思考1分(fen)鐘鐘再往下看!

操作一個(ge)文件時無非(fei)就(jiu)以下三個(ge)步驟:

第一:打開文件;

第(di)二:操作文件;

第三:關閉文件;

就是這么簡單,你(ni)在之(zhi)前的(de)生活經(jing)歷中早就掌握文件的(de)操作思路了;問題(ti)在于,在Linux中,怎么打開、操作、關閉文件?答案是用(yong)對應的(de)函數操作,所以IO的(de)學習除了了解基本概念外,就是學習函數的(de)的(de)使用(yong)。

我(wo)先以標準IO 為例:我(wo)們通過四個函數來解析基本的操(cao)作(zuo)思(si)路;

標(biao)準IO中(zhong)打(da)開文件用 fopen()函數(shu);原型(xing)為 FILE *fopen(const char *path, const char *mode);從(cong)原型(xing)中(zhong)可以看出,fopen()有兩參數(shu);形參const char *path對應(ying)就是我需要(yao)打(da)開的文件名(ming)稱(cheng),包括文件的路(lu)徑名(ming)稱(cheng);const char *mode指的是打(da)開文件后我們要(yao)對文件進(jin)行項什么樣的操作? 是讀、寫、還是添(tian)加(jia)的寫?參數(shu)如下:

mode 的(de)參數有一些固(gu)定值;

r ——只(zhi)讀方式打(da)開,

r+ ——讀寫方式打開,

以(yi)上兩個參數必須(xu)要求文件存(cun)在;

w ——只寫(xie)方式打開(kai),

w+ ——讀寫方式打來;

使(shi)用以(yi)上(shang)兩個參數時;若文(wen)件(jian)存(cun)在(zai),則(ze)會清空文(wen)件(jian),再(zai)寫(xie)入具體數據!若文(wen)件(jian)不存(cun)在(zai),則(ze)創(chuang)建文(wen)件(jian)再(zai)寫(xie)入數據;

a —— 以只寫方式打開;

a+ —— 以讀寫方式(shi)打開;

以上兩個參數使用(yong)時,若(ruo)文件存在(zai),則(ze)在(zai)后(hou)面添加數據,若(ruo)文件不存在(zai),則(ze)創建再(zai)寫入數據;

 上面的6個參(can)數(shu)就(jiu)是(shi)mode 可以寫入的全部值;(都是(shi)單(dan)獨使(shi)用的)

在(zai)fopen前(qian)有一(yi)個FILE *; 它是什么呢(ni)?當我們創(chuang)建一(yi)個打開一(yi)個文(wen)件(jian)時,就會(hui)創(chuang)建一(yi)個FILE 結構(gou)(gou)體描述改(gai)文(wen)件(jian),或者說是創(chuang)建一(yi)個FILE文(wen)件(jian)結構(gou)(gou)體和實(shi)際的(de)文(wen)件(jian)關聯起來;之(zhi)后對(dui)FILE * 變(bian)量的(de)操(cao)作(zuo)就是對(dui)文(wen)件(jian)的(de)操(cao)作(zuo);FILE 結構(gou)(gou)體也(ye)稱為流;

標(biao)準IO關閉文(wen)件(jian)的函數(shu)是 fclose()函數(shu),原型為:int fclose(FILE *fp);

只要把對應(ying)的文件流變量傳給fclose()就(jiu)可以了;

我們先來看一個fopen()函數的例子;
#include <stdio.h>
 
int main(int argc,char *argv[])
{
 
     FILE *fp;
 
     if(argc !=2)
     {
        printf("usage %s <filename>\n",argv[0]);
        exit(1);
     }
 
     fp = fopen(argv[1],"w");
     if(fp == NULL)
     {
         perror("perror");
         exit(1);
     }
 
      fclose(fp);
      return 0;
}

上面就是一個(ge)簡單的打開文件的程序;

接下來要(yao)做的(de)事(shi)就是怎么去(qu)操作文(wen)件?

文(wen)件(jian)(jian)的(de)操作分(fen)兩種方式,對文(wen)件(jian)(jian)進行讀,或(huo)者(zhe)對文(wen)件(jian)(jian)進行寫!

 讀(du)寫的函數比較多,作(zuo)(zuo)者以fgets()和fputs()為(wei)例來講解如何對(dui)文(wen)件(jian)進行讀(du)寫操(cao)作(zuo)(zuo);首先(xian)是(shi)fgets(); 它的主要作(zuo)(zuo)用是(shi)從文(wen)件(jian)流中(zhong)讀(du)取(qu)數據,原型: char *fgets(char *s, int size, FILE *stream);對(dui)應的參數從后往(wang)前看,FILE *stream 指的是(shi)要讀(du)取(qu)的文(wen)件(jian)流,也會是(shi)要從此文(wen)件(jian)中(zhong)讀(du)取(qu)數據;每(mei)次讀(du)的大(da)小對(dui)應 int size ,并(bing)把數據存放到 char *s 對(dui)應的地址,成功會返回讀(du)到的字節數, 失敗返回NULL;

下面時fgets()的實例程序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,  char *argv[])
{
   FILE *fp;
   char buf[20];
 
  if(argc !=2)
  {
     printf("usage %s <filename>\n",argv[0]);
     exit(1);
  }
  fp = fopen(argv[1],"r");
  if(fp == NULL)
  {
     perror("fopen failed");
     exit(1);
  }
  while (fgets(buf, 20, fp) !=NULL)
   {
     printf("%s",buf);
      }
fclose(fp);
  return 0;
}

上面的(de)(de)程(cheng)序中(zhong)關(guan)于fgets()使用, 程(cheng)序每次(ci)從fp對(dui)應的(de)(de)文件中(zhong)讀取19個字節數據(ju)并存在(zai)在(zai)buf中(zhong),并且在(zai)屏幕(mu)上打印出來(lai);直到數據(ju)讀完為止(zhi);

那么,如果想從一個文件中讀取數據并寫到另一個文件中,該怎么做?這就可以在上面的程序基礎上添加一個函數的fputs();它的原型:int fputs(const char *s, FILE *stream); 對應的參數FILE *stream 是被寫入的文件,也就是把數據寫入此文件中;const char *s 是需要寫入的數據; 實現從一個文件中讀取數據并寫到另一個文件中的程序就可以這樣做;
#include <stdio.h>
#include <stdlib.h>
 
 
int main(int argc,char *argv[])
{
 
     FILE *read_fp,*write_fp;
     char buf[10];
 
     if(argc !=3)
     {
        printf("usage %s <read_filename> <write_filename>\n",argv[0]);
        exit(1);
     }
 
     read_fp = fopen(argv[1],"r");
     if(read_fp == NULL)
     {
        perror("read_fopen failed");
        exit(1);
     }
 
     write_fp = fopen(argv[2],"w");
     if(write_fp == NULL)
     {
        perror("write_fp fopen failed");
        exit(1);
     }
 
     while(fgets(buf, 10, read_fp) !=NULL)
     {
          fputs(buf, write_fp);
     }
 
fclose(read_fp);
fclose(write_fp);
 
      return 0;
}

通(tong)過(guo)上面的(de)(de)概(gai)念及函數的(de)(de)使(shi)用,我(wo)們解析了標準IO中對文件的(de)(de)基本操作(zuo),當然,對文件的(de)(de)操作(zuo)函數還有很(hen)多(duo),但操作(zuo)思(si)路(lu)基本一樣;讀者可以(yi)以(yi)此(ci)為(wei)突破口進(jin)行(xing)更深入的(de)(de)學習。

上一篇:GDB調試入門(一)

下一篇:數據結構之順序表

熱(re)點文章推薦(jian)
華清學員就業榜單
高薪學員(yuan)經(jing)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部