精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲色图网站| 中文成人在线| 中文字幕电影一区| 波多野结衣成人在线| 国产精品.www| jiujiure精品视频播放| 欧美成人乱码一区二区三区| 人妻有码中文字幕| 黄色网址在线免费观看| av成人老司机| 成人在线国产精品| 天天操天天操天天操天天| 艳女tv在线观看国产一区| 亚洲美女av在线播放| 麻豆网站免费观看| 九九久久国产| 一本大道久久精品懂色aⅴ| 视频一区二区视频| www 日韩| 99国产精品久久久久久久久久 | 老色鬼精品视频在线观看播放| 欧美老女人xx| 91麻豆精品久久毛片一级| 麻豆一区二区麻豆免费观看| 91精品久久久久久久91蜜桃| 日日碰狠狠躁久久躁婷婷| 黄网av在线| 成人免费在线播放视频| 秋霞久久久久久一区二区| 天堂在线视频免费| 国产成人精品一区二区三区网站观看 | 欧美精品第1页| 国产精品亚洲二区在线观看| 草莓视频丝瓜在线观看丝瓜18| 中文字幕一区二| 亚洲精品中文字幕在线| 国产小视频免费在线网址| 99在线精品观看| 国产精品日韩欧美一区二区三区| 91中文字幕在线播放| 蜜桃av一区二区| 国产精品美女久久久久久免费 | 精品国产欧美一区二区| 交换做爰国语对白| 国产在线一区不卡| 欧美一区二区私人影院日本| 亚洲欧美视频二区| 成人国产激情在线| 欧美在线999| 亚洲三级视频网站| 国内自拍亚洲| 欧美日韩中文字幕一区| 亚洲欧美日韩一级| 少妇高潮一区二区三区99| 51午夜精品国产| 看看黄色一级片| 国内不卡的一区二区三区中文字幕 | 97在线精品国自产拍中文| 国产精品19乱码一区二区三区| 午夜精品久久久久99热蜜桃导演| 欧美成人免费观看| 国产一级片免费| 国产亚洲高清视频| 国产97在线播放| 中文字幕一区二区在线视频| 久久久蜜桃一区二区人| 国产精品视频中文字幕91| 一二三区在线播放| 国产精品性做久久久久久| 国产精品二区三区| 欧美另类自拍| 一色桃子久久精品亚洲| 青青草综合在线| 久草在线中文最新视频| 欧美综合色免费| 日韩欧美中文视频| 国产精品对白| 亚洲国产精品高清久久久| 国产熟妇久久777777| 日韩一区二区在线免费| 欧美成人午夜影院| 91视频免费网址| 日本不卡视频在线| 亚洲综合大片69999| 污视频在线免费观看| 日本一区二区三区视频视频| 精品91一区二区三区| 高清毛片在线观看| 欧美视频三区在线播放| 白丝校花扒腿让我c| 伊人久久大香线蕉av不卡| 中文字幕亚洲图片| 久久精品视频8| 美女高潮久久久| 国产日韩三区| 免费a在线看| 欧美午夜精品在线| 日本美女久久久| 亚洲老女人视频免费| 欧美成人免费在线观看| 亚洲综合久久网| 国产成人免费视频网站 | av每日在线更新| 亚洲午夜精品网| 自拍偷拍一区二区三区四区| 久久影视三级福利片| 色偷偷av一区二区三区| av中文在线播放| 国产成人丝袜美腿| 午夜在线视频免费观看| 成人福利视频| 亚洲第一福利在线观看| 国产成人综合在线视频| 日本最新不卡在线| 麻豆久久久av免费| 国产在线拍揄自揄拍视频| 欧美日韩免费一区二区三区| 搡老熟女老女人一区二区| 午夜精品国产| 亚洲一区二区三区sesese| 草草影院在线观看| 色综合久久66| av无码一区二区三区| 欧美.www| 亚洲综合中文字幕在线观看| 91涩漫在线观看| 一本色道久久综合精品竹菊| 三级视频网站在线观看| 黄色av成人| av一区二区三区在线观看| 日本黄色片在线观看| 色综合一个色综合亚洲| 黄色录像a级片| 亚洲另类视频| 精品久久久久久一区二区里番| 久久国产精品黑丝| 精品少妇一区二区三区日产乱码 | 久久在线精品| 欧美人xxxxx| 日韩av福利| 国产亚洲美女久久| 黄色网址中文字幕| 日本一区二区三区免费乱视频| 亚洲免费av一区二区三区| 伊人久久大香线蕉| 国产精品福利网站| 1024国产在线| 欧美高清hd18日本| 国产av 一区二区三区| 国产一区二区不卡老阿姨| 四虎影院一区二区| 秋霞一区二区| 久久久久久久成人| 五月婷婷在线观看视频| 黑人巨大精品欧美一区二区三区 | 91免费精品| 亚洲xxxx做受欧美| 丁香花在线影院| 亚洲娇小xxxx欧美娇小| 狠狠人妻久久久久久| 国产三级精品视频| 污污网站免费观看| 黄色综合网站| 久久综合色一本| 激情久久99| 九九热精品视频| 天堂中文在线看| 在线观看三级视频欧美| 老司机深夜福利网站| 国产丶欧美丶日本不卡视频| 国产美女网站在线观看| 国产麻豆精品久久| 亚洲精品欧美日韩专区| 黑森林国产精品av| 在线成人激情视频| 国产xxxxxx| 日韩欧美在线字幕| 日本爱爱小视频| 高清国产一区二区三区| 成熟老妇女视频| 天天综合网91| 国产亚洲欧美一区二区三区| 午夜欧美巨大性欧美巨大| 色婷婷综合成人av| 五月婷婷六月丁香综合| 欧美日韩国产精品自在自线| 国产亚洲精品av| 久久精品一区二区| 少妇伦子伦精品无吗| 三级久久三级久久| 成人免费看片'免费看| 一本色道久久综合狠狠躁的番外| 91久久久久久久久久| 美女91在线看| 久久在线免费视频| 国产三区四区在线观看| 欧美电影免费观看完整版| 黄色大全在线观看| 狠狠色香婷婷久久亚洲精品| 懂色av粉嫩av蜜臀av一区二区三区| av中文一区二区三区| 天堂在线一区二区三区| 校园春色综合网| www.18av.com| 久久一区91| 久久综合九色综合网站| 日本超碰一区二区| 国产欧美日韩丝袜精品一区| 激情黄产视频在线免费观看| 中国人与牲禽动交精品| 婷婷av一区二区三区| 欧美一区二区大片| 中文字幕在线日亚洲9| 欧美小视频在线| 麻豆影视在线播放| 亚洲视频在线一区二区| jizz中文字幕| www久久精品| 国产婷婷在线观看| 国产盗摄一区二区三区| www.午夜av| 久久99精品国产麻豆婷婷洗澡| 国产福利视频在线播放| 亚洲久久成人| 国产一区二区视频播放| 国内精品美女在线观看| 欧美一级黄色录像片| 99久久亚洲精品蜜臀| 亚洲精品一区二区三区四区五区| 亚洲调教一区| 秋霞毛片久久久久久久久| 亚洲欧洲av| 欧美黄色直播| 国产日产一区| 日本一区美女| 国产日韩视频在线| 视频在线精品一区| 日韩精品二区| 中文字幕黄色大片| 婷婷亚洲五月| 四虎4hu永久免费入口| 欧美高清不卡| 免费在线看黄色片| 日韩一级精品| 91视频最新入口| 亚洲欧美成人| 精品久久久久久中文字幕2017| 日本亚洲欧美天堂免费| 午夜免费福利在线| 精品在线一区二区三区| 日本高清免费在线视频| 国产乱子轮精品视频| 永久免费看片在线观看| 高清不卡一区二区在线| 精品一区二区视频在线观看| 99国产精品久久久久久久久久| 人妻少妇一区二区| 欧美国产成人在线| 男人的午夜天堂| 一区二区三区免费观看| 激情五月婷婷在线| 黄网动漫久久久| 少妇久久久久久久| 欧美猛男gaygay网站| 国产 日韩 欧美 综合| 日韩电视剧在线观看免费网站| 美女欧美视频在线观看免费 | 欧美成人性战久久| 天天干天天操av| 在线观看精品国产视频| 9191在线播放| 欧美孕妇性xx| 国产麻豆一区二区三区| 国内一区在线| 成人vr资源| av久久久久久| 麻豆精品91| 99精品999| 99re成人精品视频| 亚洲女人久久久| 午夜精品福利一区二区蜜股av| 日本精品入口免费视频| 日韩视频一区二区三区| 日韩大片b站免费观看直播| 深夜福利一区二区| 麻豆蜜桃在线观看| 91精品啪在线观看麻豆免费| 欧美巨大xxxx| 亚洲欧美日韩不卡| 国产欧美短视频| 欧美国产日韩另类 | 欧美精品国产精品久久久 | 99精品在免费线中文字幕网站一区 | 亚洲色图美女| 国产成人一二三区| 日韩精品一二三区| 你懂的在线观看网站| 国产精品久久福利| 一级成人黄色片| 亚洲国产成人91精品| 日本激情视频在线观看| 日韩av色在线| 精品少妇一区| 欧美日韩午夜爽爽| 麻豆国产欧美日韩综合精品二区 | 亚洲国产欧美另类| 社区色欧美激情 | 国产v综合v| 九色91国产| 国产伊人精品| 五月天六月丁香| 国产精品乱码妇女bbbb| 国产精品免费精品一区| 亚洲二区在线播放视频| 成人福利在线观看视频| 国产精品久久久久福利| 色先锋久久影院av| 大西瓜av在线| 国产成a人亚洲精| 日韩精品123区| 欧美日韩和欧美的一区二区| 你懂的视频在线免费| 97视频com| 国产亚洲精品美女久久| 大西瓜av在线| 成人免费高清视频| 欧美三级 欧美一级| 欧美一区二区三区影视| 毛片在线看网站| 成人网欧美在线视频| 久久麻豆精品| 亚洲18在线看污www麻豆| 欧美国产日韩a欧美在线观看 | 超碰在线网站| 国产精品乱码视频| 亚洲日韩视频| 182在线视频| 欧美三级免费观看| 亚洲欧洲精品视频| 全球成人中文在线| 视频一区中文| 久久久久久蜜桃一区二区| 欧美激情一区二区三区全黄 | 麻豆freexxxx性91精品| 亚洲a∨无码无在线观看| 欧美日韩精品一区二区天天拍小说 | 91美女视频网站| 久久久久在线视频| 国产亚洲欧美日韩精品| 亚洲精品成a人ⅴ香蕉片| 亚洲第一综合网站| 国产成人免费视频| 午夜精品久久久久久久久久久久久蜜桃| 精品电影一区二区| 国产高清自产拍av在线| 免费一区二区三区| 麻豆91精品视频| 岛国毛片在线观看| 亚洲国产精品字幕| 日韩影片中文字幕| 中文字幕日韩一区二区三区| 国产成人自拍网| 中日韩黄色大片| 这里精品视频免费| 免费看一区二区三区| 成人网站免费观看入口| 久久久久久夜精品精品免费| 中文字幕福利视频| 欧美日本高清视频| 亚洲影院天堂中文av色| 免费av不卡在线| 亚洲国产一区二区a毛片| 男同在线观看| 亚洲free性xxxx护士hd| 国产精品视频| 午夜精品久久久久99蜜桃最新版 | 四虎精品一区二区| 91久久精品国产91性色tv| 国产日产一区二区| 久久久久久艹| 国产又粗又猛又爽又黄91精品| 日本天堂在线视频| 日韩中文字幕精品| 日本亚洲不卡| 中日韩av在线播放| 欧美性黄网官网| av激情在线| 日韩福利影院| 不卡av在线免费观看| 伊人久久成人网| 3344国产精品免费看| 91日韩视频| 久久精品成人av| 精品国产免费人成电影在线观看四季| 免费电影日韩网站| a级黄色片免费| 欧美国产97人人爽人人喊| 四季av日韩精品一区| 91免费观看网站| 日韩精品色哟哟|