中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

如何用C語言來進行文件輸入輸出操作

本篇內(nèi)容主要講解“如何用 C 語言來進行文件輸入輸出操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“如何用 C 語言來進行文件輸入輸出操作”吧!

創(chuàng)新互聯(lián)于2013年成立,先為殷都等服務(wù)建站,殷都等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為殷都企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

如果你打算學(xué)習(xí) C 語言的輸入、輸出,可以從 stdio.h 包含文件開始。正如你從其名字中猜到的,該文件定義了所有的標(biāo)準(zhǔn)(“std”)的輸入和輸出(“io”)函數(shù)。

大多數(shù)人學(xué)習(xí)的第一個 stdio.h 的函數(shù)是打印格式化輸出的 printf 函數(shù)。或者是用來打印一個字符串的 puts 函數(shù)。這些函數(shù)非常有用,可以將信息打印給用戶,但是如果你想做更多的事情,則需要了解其他函數(shù)。

你可以通過編寫一個常見 Linux 命令的副本來了解其中一些功能和方法。cp 命令主要用于復(fù)制文件。如果你查看 cp 的幫助手冊,可以看到 cp 命令支持非常多的參數(shù)和選項。但最簡單的功能,就是復(fù)制文件:

cp infile outfile

你只需使用一些讀寫文件的基本函數(shù),就可以用 C 語言來自己實現(xiàn) cp 命令。

一次讀寫一個字符

你可以使用 fgetc 和 fputc 函數(shù)輕松地進行輸入輸出。這些函數(shù)一次只讀寫一個字符。該用法被定義在 stdio.h,并且這也很淺顯易懂:fgetc 是從文件中讀取一個字符,fputc 是將一個字符保存到文件中。

int fgetc(FILE *stream);int fputc(int c, FILE *stream);

編寫 cp 命令需要訪問文件。在 C 語言中,你使用 fopen 函數(shù)打開一個文件,該函數(shù)需要兩個參數(shù):文件名和打開文件的模式。模式通常是從文件讀取(r)或向文件寫入(w)。打開文件的方式也有其他選項,但是對于本教程而言,僅關(guān)注于讀寫操作。

因此,將一個文件復(fù)制到另一個文件就變成了打開源文件和目標(biāo)文件,接著,不斷從第一個文件讀取字符,然后將該字符寫入第二個文件。fgetc 函數(shù)返回從輸入文件中讀取的單個字符,或者當(dāng)文件完成后返回文件結(jié)束標(biāo)記(EOF)。一旦讀取到 EOF,你就完成了復(fù)制操作,就可以關(guān)閉兩個文件。該代碼如下所示:

  do {    ch = fgetc(infile);    if (ch != EOF) {      fputc(ch, outfile);    }  } while (ch != EOF);

你可以使用此循環(huán)編寫自己的 cp 程序,以使用 fgetc 和 fputc 函數(shù)一次讀寫一個字符。cp.c 源代碼如下所示:

#include <stdio.h> intmain(int argc, char **argv){  FILE *infile;  FILE *outfile;  int ch;   /* parse the command line */   /* usage: cp infile outfile */   if (argc != 3) {    fprintf(stderr, "Incorrect usage\n");    fprintf(stderr, "Usage: cp infile outfile\n");    return 1;  }   /* open the input file */   infile = fopen(argv[1], "r");  if (infile == NULL) {    fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]);    return 2;  }   /* open the output file */   outfile = fopen(argv[2], "w");  if (outfile == NULL) {    fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]);    fclose(infile);    return 3;  }   /* copy one file to the other */   /* use fgetc and fputc */   do {    ch = fgetc(infile);    if (ch != EOF) {      fputc(ch, outfile);    }  } while (ch != EOF);   /* done */   fclose(infile);  fclose(outfile);   return 0;}

你可以使用 gcc 來將 cp.c 文件編譯成一個可執(zhí)行文件:

$ gcc -Wall -o cp cp.c

-o cp 選項告訴編譯器將編譯后的程序保存到 cp 文件中。-Wall 選項告訴編譯器提示所有可能的警告,如果你沒有看到任何警告,則表示一切正常。

讀寫數(shù)據(jù)塊

通過每次讀寫一個字符來實現(xiàn)自己的 cp 命令可以完成這項工作,但這并不是很快。在復(fù)制“日常”文件(例如文檔和文本文件)時,你可能不會注意到,但是在復(fù)制大型文件或通過網(wǎng)絡(luò)復(fù)制文件時,你才會注意到差異。每次處理一個字符需要大量的開銷。

實現(xiàn)此 cp 命令的一種更好的方法是,讀取一塊的輸入數(shù)據(jù)到內(nèi)存中(稱為緩存),然后將該數(shù)據(jù)集合寫入到第二個文件。這樣做的速度要快得多,因為程序可以一次讀取更多的數(shù)據(jù),這就就減少了從文件中“讀取”的次數(shù)。

你可以使用 fread 函數(shù)將文件讀入一個變量中。這個函數(shù)有幾個參數(shù):將數(shù)據(jù)讀入的數(shù)組或內(nèi)存緩沖區(qū)的指針(ptr),要讀取的最小對象的大小(size),要讀取對象的個數(shù)(nmemb),以及要讀取的文件(stream):

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

不同的選項為更高級的文件輸入和輸出(例如,讀取和寫入具有特定數(shù)據(jù)結(jié)構(gòu)的文件)提供了很大的靈活性。但是,在從一個文件讀取數(shù)據(jù)并將數(shù)據(jù)寫入另一個文件的簡單情況下,可以使用一個由字符數(shù)組組成的緩沖區(qū)。

你可以使用 fwrite 函數(shù)將緩沖區(qū)中的數(shù)據(jù)寫入到另一個文件。這使用了與 fread 函數(shù)有相似的一組選項:要從中讀取數(shù)據(jù)的數(shù)組或內(nèi)存緩沖區(qū)的指針,要讀取的最小對象的大小,要讀取對象的個數(shù)以及要寫入的文件。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

如果程序?qū)⑽募x入緩沖區(qū),然后將該緩沖區(qū)寫入另一個文件,則數(shù)組(ptr)可以是固定大小的數(shù)組。例如,你可以使用長度為 200 個字符的字符數(shù)組作為緩沖區(qū)。

在該假設(shè)下,你需要更改 cp 程序中的循環(huán),以將數(shù)據(jù)從文件讀取到緩沖區(qū)中,然后將該緩沖區(qū)寫入另一個文件中:

  while (!feof(infile)) {    buffer_length = fread(buffer, sizeof(char), 200, infile);    fwrite(buffer, sizeof(char), buffer_length, outfile);  }

這是更新后的 cp 程序的完整源代碼,該程序現(xiàn)在使用緩沖區(qū)讀取和寫入數(shù)據(jù):

#include <stdio.h> intmain(int argc, char **argv){  FILE *infile;  FILE *outfile;  char buffer[200];  size_t buffer_length;   /* parse the command line */   /* usage: cp infile outfile */   if (argc != 3) {    fprintf(stderr, "Incorrect usage\n");    fprintf(stderr, "Usage: cp infile outfile\n");    return 1;  }   /* open the input file */   infile = fopen(argv[1], "r");  if (infile == NULL) {    fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]);    return 2;  }   /* open the output file */   outfile = fopen(argv[2], "w");  if (outfile == NULL) {    fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]);    fclose(infile);    return 3;  }   /* copy one file to the other */   /* use fread and fwrite */   while (!feof(infile)) {    buffer_length = fread(buffer, sizeof(char), 200, infile);    fwrite(buffer, sizeof(char), buffer_length, outfile);  }   /* done */   fclose(infile);  fclose(outfile);   return 0;}

由于你想將此程序與其他程序進行比較,因此請將此源代碼另存為 cp2.c。你可以使用 gcc 編譯程序:

$ gcc -Wall -o cp2 cp2.c

和之前一樣,-o cp2 選項告訴編譯器將編譯后的程序保存到 cp2 程序文件中。-Wall 選項告訴編譯器打開所有警告。如果你沒有看到任何警告,則表示一切正常。

是的,這真的更快了

使用緩沖區(qū)讀取和寫入數(shù)據(jù)是實現(xiàn)此版本 cp 程序更好的方法。由于它可以一次將文件的多個數(shù)據(jù)讀取到內(nèi)存中,因此該程序不需要頻繁讀取數(shù)據(jù)。在小文件中,你可能沒有注意到使用這兩種方案的區(qū)別,但是如果你需要復(fù)制大文件,或者在較慢的介質(zhì)(例如通過網(wǎng)絡(luò)連接)上復(fù)制數(shù)據(jù)時,會發(fā)現(xiàn)明顯的差距。

我使用 Linux time 命令進行了比較。此命令可以運行另一個程序,然后告訴你該程序花費了多長時間。對于我的測試,我希望了解所花費時間的差距,因此我復(fù)制了系統(tǒng)上的 628 MB CD-ROM 鏡像文件。

我首先使用標(biāo)準(zhǔn)的 Linux 的 cp 命令復(fù)制了映像文件,以查看所需多長時間。一開始通過運行 Linux 的 cp 命令,同時我還避免使用 Linux 內(nèi)置的文件緩存系統(tǒng),使其不會給程序帶來誤導(dǎo)性能提升的可能性。使用 Linux cp 進行的測試,總計花費不到一秒鐘的時間:

$ time cp FD13LIVE.iso tmpfile real    0m0.040suser    0m0.001ssys     0m0.003s

運行我自己實現(xiàn)的 cp 命令版本,復(fù)制同一文件要花費更長的時間。每次讀寫一個字符則花了將近五秒鐘來復(fù)制文件:

$ time ./cp FD13LIVE.iso tmpfile real    0m4.823suser    0m4.100ssys     0m0.571s

從輸入讀取數(shù)據(jù)到緩沖區(qū),然后將該緩沖區(qū)寫入輸出文件則要快得多。使用此方法復(fù)制文件花不到一秒鐘:

$ time ./cp2 FD13LIVE.iso tmpfile real    0m0.944suser    0m0.224ssys     0m0.608s

我演示的 cp 程序使用了 200 個字符大小的緩沖區(qū)。我確信如果一次將更多文件數(shù)據(jù)讀入內(nèi)存,該程序?qū)⑦\行得更快。但是,通過這種比較,即使只有 200 個字符的緩沖區(qū),你也已經(jīng)看到了性能上的巨大差異。

到此,相信大家對“如何用 C 語言來進行文件輸入輸出操作”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享文章:如何用C語言來進行文件輸入輸出操作
本文路徑:http://m.2m8n56k.cn/article24/pgcgce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站營銷型網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計網(wǎng)站設(shè)計動態(tài)網(wǎng)站電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
主站蜘蛛池模板: 精品国产一区二区三区四区vr | 亚洲精品m在线观看 | 一区二区三区在线免费观看视频 | 香港一级特黄高清免费 | 欧美大片一区二区三区 | 久草在线视频免费播放 | 一区二区三区在线观看免费 | 久久伊人成人网 | 女女同性一区二区三区四区 | 男人和女人在床做黄的网站 | 亚欧精品在线观看 | 嫩模大尺度人体福利视频 | 欧美 日韩 国产 在线 | 久久免费观看国产精品 | 手机看片福利视频 | 国产精品免费综合一区视频 | 97久久曰曰久久久 | 亚洲欧美成人影院 | 特级一级毛片视频免费观看 | 一级毛片免费不卡在线视频 | 久草在线视频网 | 久久成年片色大黄全免费网站 | 欧美日韩国产成人精品 | 欧美激情 自拍 | 免费成年人在线视频 | 99久久精品免费视频 | 国产精品久久久久a影院 | 欧美精品久久久久久久免费观看 | 国产精品久久久久久久9999 | 亚洲一区欧美二区 | 国内真实愉拍系列情侣 | 国产成人高清一区二区私人 | 国产亚洲男人的天堂在线观看 | 国产免费一区二区三区 | 国产午夜a理论毛片在线影院 | 国产成人免费午夜性视频 | 美女黄频免费看 | 午夜剧场福利社 | yellow中文字幕久久网 | 久久精品视频在线观看榴莲视频 | 国产在线爱做人成小视频 |