精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發 后端
如果你打算學習 C 語言的輸入、輸出,可以從 stdio.h 包含文件開始。正如你從其名字中猜到的,該文件定義了所有的標準(“std”)的輸入和輸出(“io”)函數。

[[390686]]

理解 I/O 有助于提升你的效率。

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

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

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

  1. cp infile outfile

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

一次讀寫一個字符

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

  1. int fgetc(FILE *stream);
  2. int fputc(int c, FILE *stream);

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

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

  1. do {
  2. ch = fgetc(infile);
  3. if (ch != EOF) {
  4. fputc(ch, outfile);
  5. }
  6. } while (ch != EOF);

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

  1. #include <stdio.h>
  2.  
  3. int
  4. main(int argc, char **argv)
  5. {
  6. FILE *infile;
  7. FILE *outfile;
  8. int ch;
  9.  
  10. /* parse the command line */
  11.  
  12. /* usage: cp infile outfile */
  13.  
  14. if (argc != 3) {
  15. fprintf(stderr, "Incorrect usage\n");
  16. fprintf(stderr, "Usage: cp infile outfile\n");
  17. return 1;
  18. }
  19.  
  20. /* open the input file */
  21.  
  22. infile = fopen(argv[1], "r");
  23. if (infile == NULL) {
  24. fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]);
  25. return 2;
  26. }
  27.  
  28. /* open the output file */
  29.  
  30. outfile = fopen(argv[2], "w");
  31. if (outfile == NULL) {
  32. fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]);
  33. fclose(infile);
  34. return 3;
  35. }
  36.  
  37. /* copy one file to the other */
  38.  
  39. /* use fgetc and fputc */
  40.  
  41. do {
  42. ch = fgetc(infile);
  43. if (ch != EOF) {
  44. fputc(ch, outfile);
  45. }
  46. } while (ch != EOF);
  47.  
  48. /* done */
  49.  
  50. fclose(infile);
  51. fclose(outfile);
  52.  
  53. return 0;
  54. }

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

  1. $ gcc -Wall -o cp cp.c

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

讀寫數據塊

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

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

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

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

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

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

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

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

在該假設下,你需要更改 cp 程序中的循環,以將數據從文件讀取到緩沖區中,然后將該緩沖區寫入另一個文件中:

  1. while (!feof(infile)) {
  2. buffer_length = fread(buffer, sizeof(char), 200, infile);
  3. fwrite(buffer, sizeof(char), buffer_length, outfile);
  4. }

這是更新后的 cp 程序的完整源代碼,該程序現在使用緩沖區讀取和寫入數據:

  1. #include <stdio.h>
  2.  
  3. int
  4. main(int argc, char **argv)
  5. {
  6. FILE *infile;
  7. FILE *outfile;
  8. char buffer[200];
  9. size_t buffer_length;
  10.  
  11. /* parse the command line */
  12.  
  13. /* usage: cp infile outfile */
  14.  
  15. if (argc != 3) {
  16. fprintf(stderr, "Incorrect usage\n");
  17. fprintf(stderr, "Usage: cp infile outfile\n");
  18. return 1;
  19. }
  20.  
  21. /* open the input file */
  22.  
  23. infile = fopen(argv[1], "r");
  24. if (infile == NULL) {
  25. fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]);
  26. return 2;
  27. }
  28.  
  29. /* open the output file */
  30.  
  31. outfile = fopen(argv[2], "w");
  32. if (outfile == NULL) {
  33. fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]);
  34. fclose(infile);
  35. return 3;
  36. }
  37.  
  38. /* copy one file to the other */
  39.  
  40. /* use fread and fwrite */
  41.  
  42. while (!feof(infile)) {
  43. buffer_length = fread(buffer, sizeof(char), 200, infile);
  44. fwrite(buffer, sizeof(char), buffer_length, outfile);
  45. }
  46.  
  47. /* done */
  48.  
  49. fclose(infile);
  50. fclose(outfile);
  51.  
  52. return 0;
  53. }

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

  1. $ gcc -Wall -o cp2 cp2.c

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

是的,這真的更快了

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

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

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

  1. $ time cp FD13LIVE.iso tmpfile
  2.  
  3. real 0m0.040s
  4. user 0m0.001s
  5. sys 0m0.003s

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

  1. $ time ./cp FD13LIVE.iso tmpfile
  2.  
  3. real 0m4.823s
  4. user 0m4.100s
  5. sys 0m0.571s

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

  1. $ time ./cp2 FD13LIVE.iso tmpfile
  2.  
  3. real 0m0.944s
  4. user 0m0.224s
  5. sys 0m0.608s

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

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2024-11-20 10:00:00

Python文件讀寫

2021-04-12 15:34:33

C語言printfscanf

2009-12-17 11:36:55

Ruby輸入輸出

2010-02-06 14:28:38

C++標準輸入輸出

2020-01-10 17:45:06

Git共享文件開源

2010-02-03 15:35:00

C++輸入輸出漢字

2016-11-16 15:05:42

情感分析

2020-09-04 11:02:47

Java技巧參數

2011-11-28 09:25:36

Java輸入輸出

2021-05-07 20:01:23

IO輸入輸出

2011-09-01 18:54:29

WifiGoodReader

2018-03-27 13:33:48

百度

2016-12-14 09:32:49

FileChanne文件復制

2021-04-04 08:00:39

C++編程語言軟件開發

2020-09-24 16:05:44

C語言sqlite3函數

2011-07-11 11:05:09

Windows控制臺

2014-09-04 11:39:43

Linux

2009-12-23 10:57:20

nohup命令

2023-10-30 08:53:36

Python輸入輸出

2010-03-12 19:29:15

python svn腳
點贊
收藏

51CTO技術棧公眾號

成人中文字幕av| 日本在线观看一区二区三区| 欧美日韩在线观看免费| 亚洲国产aⅴ精品一区二区| 亚洲综合久久久久| 六月丁香久久丫| 深夜激情久久| 亚洲超碰精品一区二区| 欧美日韩一区二区三| 在线视频免费观看一区| 欧美淫片网站| 亚洲欧美另类自拍| 亚洲激情在线看| 91资源在线观看| 国产清纯白嫩初高生在线观看91 | 91蜜桃在线视频| 91丨porny丨中文| 成人美女av在线直播| 日韩免费观看一区二区| 日本久久一二三四| 亚洲国产精品资源| 日本精品一区在线| 欧美成人资源| 亚洲午夜久久久久久久久电影院| 日韩中文字幕一区二区| 性猛交xxxx乱大交孕妇印度| 日韩精品亚洲专区| 欧美激情日韩图片| 美国黑人一级大黄| 天美av一区二区三区久久| 欧美精品在欧美一区二区少妇| 91国视频在线| 主播国产精品| 中文字幕中文字幕中文字幕亚洲无线| 美女一区视频| 好吊视频一二三区| 国产精品一区免费视频| 国产精品欧美一区二区| 一区二区三区福利视频| 欧美黄色一区| 久久亚洲综合国产精品99麻豆精品福利| av在线网站观看| 久久精品福利| 国产精品久久久久9999高清| 黑人巨大精品欧美| 91精品大全| 91美女视频网站| 国产aⅴ精品一区二区三区黄| 亚洲午夜激情视频| 日韩国产精品久久久久久亚洲| 久久久午夜视频| 高h视频免费观看| 91不卡在线观看| 中文字幕视频在线免费欧美日韩综合在线看 | 1024亚洲合集| 亚洲一区二区高清视频| 国产中文字幕在线看| 2017欧美狠狠色| 久久久久天天天天| 手机看片一区二区| 99精品桃花视频在线观看| 国产精品久久国产三级国电话系列| 99久久精品日本一区二区免费 | 亚洲影视在线观看| 在线观看污视频| dy888亚洲精品一区二区三区| 亚洲欧洲av一区二区三区久久| 在线视频91| av毛片在线播放| 一区二区三区鲁丝不卡| av片在线免费| 五月天av在线| 91久久国产综合久久| av免费网站观看| 国内精品伊人| 欧美xingq一区二区| 97精品人人妻人人| 午夜欧洲一区| 色偷偷综合社区| av激情在线观看| 一区在线视频| 国产91亚洲精品| 一级黄色片在线播放| 国产资源精品在线观看| 爱情岛论坛亚洲入口| 欧美一级特黄aaaaaa| 91视频精品在这里| 一区二区在线观| 国产区美女在线| 一本到三区不卡视频| 午夜宅男在线视频| 久久伊人影院| 日韩av一区二区在线| 微拍福利一区二区| 一区二区中文| 日韩美女av在线免费观看| 91福利在线观看视频| 成人午夜av影视| 日本欧洲国产一区二区| 老司机精品视频在线观看6| 亚洲在线视频免费观看| 成年人网站大全| 涩爱av色老久久精品偷偷鲁| 亚洲女人天堂视频| 婷婷色中文字幕| 日韩在线a电影| 成人3d动漫一区二区三区91| 九色在线视频| 一个色综合av| 中文字幕在线综合| 另类春色校园亚洲| 久热爱精品视频线路一| 探花视频在线观看| 国产高清精品久久久久| 日韩免费中文专区| 操喷在线视频| 欧美久久久久久久久| 日韩精品卡通动漫网站| 欧美激情第8页| 国产美女扒开尿口久久久| 神宫寺奈绪一区二区三区| 国产精品国产馆在线真实露脸| 国产91在线免费| 日韩欧美另类中文字幕| 中文字幕免费精品一区高清| 圆产精品久久久久久久久久久| 国产一区二区电影| 神马影院一区二区| 美女福利一区二区| 亚洲黄页视频免费观看| 久久久精品视频免费观看| 日产欧产美韩系列久久99| 激情久久av| 日本电影在线观看| 91精品欧美综合在线观看最新| www.4hu95.com四虎| 亚洲综合不卡| 精品伊人久久大线蕉色首页| 久草在线视频网站| 日韩一区二区在线观看| 欧美视频一区二区在线| 免费成人美女在线观看.| 欧美一区二区影视| 免费电影日韩网站| 日韩精品中文字幕在线| 五月天婷婷综合网| 不卡的电视剧免费网站有什么| av一区二区三区免费观看| 精品国产亚洲日本| 久久高清视频免费| 国产男女猛烈无遮挡| 中文字幕制服丝袜一区二区三区 | 日韩av影视| 国产日韩另类视频一区| 亚洲片在线观看| 人人爽人人爽人人片av| 久久精品日产第一区二区三区高清版| 99爱视频在线| 国产剧情一区| 国产精品h片在线播放| 成人亚洲综合天堂| 欧美日韩一区中文字幕| 亚洲欧美综合7777色婷婷| 亚洲精品福利免费在线观看| 欧美三级日本三级| 国产一二三精品| 久久久久久久免费视频| 欧美日韩午夜电影网| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲成人77777| 亚洲午夜私人影院| 国产女人18毛片水真多18| 日韩午夜av| 麻豆精品传媒视频| 欧美日韩免费观看视频| 丝袜美腿亚洲一区二区| 国产精品毛片久久久久久久av| 亚洲美女视频在线观看| 无码人妻一区二区三区精品视频| 亚洲精品麻豆| 色噜噜一区二区| 精品国产欧美| 2024亚洲男人天堂| 91涩漫在线观看| 91精品国产欧美一区二区18| 国产亚洲色婷婷久久99精品| av在线不卡免费看| 一区二区三区韩国| 亚洲欧美网站在线观看| 黄色99视频| 69堂免费精品视频在线播放| 久久久999国产精品| 国模人体一区二区| 色老头久久综合| 小早川怜子一区二区的演员表| eeuss国产一区二区三区| 欧美伦理视频在线观看| 欧美一区精品| 日韩av在线电影观看| 亚洲高清999| 国产精品免费一区二区三区都可以| 污污的网站在线看| 亚洲午夜av久久乱码| 成人激情四射网| 在线观看国产日韩| 精品午夜福利在线观看| 中文av一区二区| 精品人妻一区二区三区日产| 蜜桃视频免费观看一区| 久久99中文字幕| 99国产精品一区二区| 精品欧美一区二区精品久久| 91视频亚洲| 国产成人综合av| 成人影音在线| 久久久国产视频| 福利在线播放| 亚洲成人激情在线观看| 97超碰资源站| 欧洲av一区二区嗯嗯嗯啊| 久久久综合久久| 国产精品久久国产精麻豆99网站| 天堂久久久久久| 国产成人精品1024| 在线黄色免费看| 日本在线观看不卡视频| 69堂免费视频| 很黄很黄激情成人| 99久re热视频精品98| 成人久久久久| 日韩精品一区二区三区丰满| 六月丁香久久丫| 国产欧美一区二区视频| 日韩在线网址| 99国产盗摄| 国语精品视频| 成人免费淫片视频软件| 国产成人精品一区二区三区免费| 日韩av电影在线播放| 亚洲v.com| 91黄色8090| 丁香花在线高清完整版视频| 欧美黑人国产人伦爽爽爽| 成人av福利| 欧美成年人在线观看| 天堂资源在线中文| 三级精品视频久久久久| 91美女视频在线| 日韩最新中文字幕电影免费看| 成人高清免费观看mv| 国产亚洲视频中文字幕视频| 黄色在线观看网| 在线观看精品国产视频| √天堂资源地址在线官网| 在线丨暗呦小u女国产精品| 韩国三级av在线免费观看| 亚洲视频在线视频| 国产福利在线| www亚洲欧美| 动漫一区在线| 久久99国产综合精品女同| 麻豆福利在线观看| 亚洲**2019国产| 中文字幕乱码中文乱码51精品| 欧美自拍大量在线观看| 高清不卡av| 国产精品爽爽爽| 国产精品高清一区二区| 91麻豆蜜桃| 色愁久久久久久| 日本高清久久一区二区三区| 日韩一区二区在线免费| 国产树林野战在线播放| 亚洲精品1234| 亚洲精品高清无码视频| 久久99久久久欧美国产| 可以看的av网址| 91色在线porny| 永久免费观看片现看| 亚洲六月丁香色婷婷综合久久| 久久久久久久久97| 欧美日韩亚洲视频一区| 中文av免费观看| 日韩欧美电影一区| 全色精品综合影院| 中文字幕av一区中文字幕天堂 | www.香蕉视频| 日韩成人在线视频网站| 午夜视频在线观看网站| 欧美黑人一区二区三区| 欧美羞羞视频| 91香蕉亚洲精品| 亚洲人成伊人成综合图片| 亚洲一区二区三区涩| 一区在线播放| 亚洲欧美在线精品| 成人福利视频网站| 欧日韩不卡视频| 亚洲sss视频在线视频| 中国一区二区视频| 亚洲第一页自拍| 男女啪啪在线观看| 国内精久久久久久久久久人| 美女写真久久影院| 国产成人精品免费视频大全最热 | 欧美电影在线观看网站| 岛国视频一区| 99久久视频| 欧美激情国产精品日韩| 国产精品一区二区91| 蜜臀久久99精品久久久久久| 亚洲妇女屁股眼交7| 一级特黄aaa大片在线观看| 日韩av在线一区二区| 国产精品扒开做爽爽爽的视频| 57pao成人永久免费视频| 玖玖精品一区| 亚洲一区二区三区午夜| 快she精品国产999| 女人扒开双腿让男人捅| 亚洲国产精品黑人久久久| 亚州国产精品视频| 日韩无一区二区| 麻豆传媒视频在线观看免费| 日韩免费观看网站| 美女主播精品视频一二三四| 欧美一级特黄aaaaaa在线看片| 秋霞电影网一区二区| av直播在线观看| 亚洲成人福利片| 不卡的日韩av| 九九精品视频在线观看| 91成人app| 中文字幕久久综合| 麻豆精品在线视频| 国产三级短视频| 91黄色在线观看| 麻豆国产在线播放| 5252色成人免费视频| 精品视频自拍| 黄色三级中文字幕| 粉嫩av亚洲一区二区图片| 精品国产欧美日韩不卡在线观看| 欧美日韩一区二区三区在线看 | av一级亚洲| 国产激情在线看| 国产 欧美 精品| 国产精品色在线| 久久久精品视频网站| 日韩高清有码在线| 鲁鲁在线中文| 免费在线成人av| 久久久夜精品| 亚洲一区二区自偷自拍 | 亚洲国产精品午夜在线观看| 日韩欧美国产午夜精品| 日本成人不卡| 国产在线一区二区三区播放| 国产视频一区欧美| 一二三不卡视频| 欧洲精品在线观看| 在线看av的网址| 91青草视频久久| 欧美日韩一卡| 亚洲天堂成人av| 色噜噜狠狠色综合欧洲selulu| av小片在线| 99porn视频在线| 在线午夜精品| 永久免费毛片在线观看| 欧美另类一区二区三区| www在线视频| 国产一区二区三区无遮挡 | 99在线精品视频免费观看软件 | 亚洲天堂一区二区三区四区| 亚洲一区 在线播放| 国产高清亚洲一区| 天天操天天干视频| 国产亚洲aⅴaaaaaa毛片| 日韩美香港a一级毛片| 在线观看三级网站| 成人激情小说网站| av黄色在线看| 中文字幕亚洲一区| 亚洲大奶少妇| 能在线观看的av| 中文字幕一区日韩精品欧美| 草逼视频免费看| 国产成人一区二区三区电影| 午夜片欧美伦| 粉嫩av懂色av蜜臀av分享| 色噜噜狠狠一区二区三区果冻| 国产成人l区| 免费亚洲精品视频| 国产精品自拍网站| 日本a级c片免费看三区| 久久综合电影一区| 亚洲理论电影| 久久黄色一级视频| 欧美色图12p|