国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

學(xué)習(xí)如何用 C 語(yǔ)言來(lái)進(jìn)行文件輸入輸出操作

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

[[390686]]

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

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

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

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

  1. cp infile outfile

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

一次讀寫(xiě)一個(gè)字符

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

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

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

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

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

你可以使用此循環(huán)編寫(xiě)自己的 cp 程序,以使用 fgetc 和 fputc 函數(shù)一次讀寫(xiě)一個(gè)字符。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 來(lái)將 cp.c 文件編譯成一個(gè)可執(zhí)行文件:

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

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

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

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

實(shí)現(xiàn)此 cp 命令的一種更好的方法是,讀取一塊的輸入數(shù)據(jù)到內(nèi)存中(稱(chēng)為緩存),然后將該數(shù)據(jù)集合寫(xiě)入到第二個(gè)文件。這樣做的速度要快得多,因?yàn)槌绦蚩梢砸淮巫x取更多的數(shù)據(jù),這就就減少了從文件中“讀取”的次數(shù)。

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

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

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

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

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

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

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

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

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

  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. }

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

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

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

是的,這真的更快了

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

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

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

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

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

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

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

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

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

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2024-11-20 10:00:00

Python文件讀寫(xiě)

2021-04-12 15:34:33

C語(yǔ)言printfscanf

2009-12-17 11:36:55

Ruby輸入輸出

2010-02-06 14:28:38

C++標(biāo)準(zhǔn)輸入輸出

2020-01-10 17:45:06

Git共享文件開(kāi)源

2016-11-16 15:05:42

情感分析

2010-02-03 15:35:00

C++輸入輸出漢字

2020-09-04 11:02:47

Java技巧參數(shù)

2021-05-07 20:01:23

IO輸入輸出

2011-11-28 09:25:36

Java輸入輸出

2011-09-01 18:54:29

WifiGoodReader

2018-03-27 13:33:48

百度

2009-12-23 10:57:20

nohup命令

2016-12-14 09:32:49

FileChanne文件復(fù)制

2023-10-30 08:53:36

Python輸入輸出

2020-09-24 16:05:44

C語(yǔ)言sqlite3函數(shù)

2021-04-04 08:00:39

C++編程語(yǔ)言軟件開(kāi)發(fā)

2014-09-04 11:39:43

Linux

2011-07-11 11:05:09

Windows控制臺(tái)

2010-03-12 19:29:15

python svn腳
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品任我爽爆在线播放| 中国免费黄视频| f2c人成在线观看免费视频| 中文字幕在线不卡视频| 精品久久国产97色综合| av在线不卡一区| 国产中文在线| 亚洲永久精品国产| 麻豆一区二区三区视频| 日韩电影在线一区| 亚洲综合日韩在线| 成久久久网站| 欧美人与性动交a欧美精品| 原纱央莉成人av片| 日韩国产在线播放| 国产在线一在线二| 亚洲精品成人少妇| 白白色视频在线| 欧美a在线观看| 中文字幕日韩av电影| 嫩草在线视频| 亚洲小说欧美激情另类| 白天操夜夜操| 亚洲欧美成人一区二区三区| av黄色免费在线| 久久久不卡网国产精品二区| 欧美一级视频在线播放| 丁香激情综合国产| 一区精品在线| 99国产精品国产精品久久| 波多野结衣综合网| 亚洲黄一区二区三区| 九色视频网站入口| 午夜一区二区三区在线观看| 中文在线三区| 日韩电影免费在线看| 成人免费看片网址| 精品一区中文字幕| 久久午夜夜伦鲁鲁一区二区| 亚洲成人你懂的| 日本三级在线观看网站| 亚洲人成电影网站色…| 中文字幕成人一区| 黑人巨大精品欧美一区二区桃花岛| 一区二区欧美视频| 黄色av网站在线播放| 在线看国产一区| 亚洲精品一区av| 插插插亚洲综合网| 99久久综合| 亚洲影视综合| 丝袜老师办公室里做好紧好爽| 欧美日韩免费观看一区=区三区| 成人日韩精品| 日本一区二区综合亚洲| 久草在在线视频| 亚洲国产精品久久艾草纯爱| 99爱视频在线| 国产精品女人毛片| a级片在线免费观看| 成人激情视频免费在线| 成人精品gif动图一区| 97秋霞电影网| 精品国产亚洲在线| 电影91久久久| 狠狠色综合色区| 综合久久国产九一剧情麻豆| 都市激情亚洲综合| 热久久这里只有精品| 国产福利精品导航| 美女精品视频| 蜜桃免费一区二区三区| wwww国产精品欧美| 国产日产一区二区三区| 日韩成人黄色av| 欧美在线91| 欧美日韩国产综合视频| 69视频在线免费观看| 成人激情免费电影网址| 黄色成年人视频在线观看| 成人永久免费视频| 春暖花开成人亚洲区| 国产有码在线一区二区视频| 亚洲美女一区| 免费在线一级视频| 久久国产精品影视| 天堂久久久久va久久久久| 在线免费福利| 亚洲一区二区三区久久 | 激情综合色综合久久| 中文字幕免费在线| 国产精品亚洲аv天堂网| 中文字幕五月欧美| 日韩午夜影院| 九九热精品在线| 久久久一区二区| eeuss国产一区二区三区四区| 99久久99久久精品| 亚洲第一级黄色片| 国产成人午夜高潮毛片| 永久免费毛片在线播放| www.av片| 欧美综合第一页| 在线观看不卡一区| 狠狠色丁香婷婷综合| 中文字幕综合| 污视频在线观看网站| 日本不卡久久| 91成人福利在线| 91精品国产综合久久蜜臀| 国产成人av电影| 要久久电视剧全集免费| 欧洲一区av| 91欧美激情另类亚洲| 亚洲图片激情小说| 免费人成网站在线观看欧美高清| 久久精品嫩草影院| 色影视在线观看| 免费观看黄色大片| 日韩av电影国产| www.99久久热国产日韩欧美.com| 91日本在线视频| 国产精品色悠悠| 欧美军同video69gay| 蜜桃视频一区二区| 久久精品论坛| av在线播放国产| 色综合久久久网| 日韩高清在线电影| 欧美午夜精彩| www.av一区视频| 亚洲精品高潮| 欧美男男同志| 国产91精品久久久| 亚洲精品福利视频| 欧美日韩免费视频| 亚洲欧美一区二区久久| 久久综合成人精品亚洲另类欧美| 久久视频精品| 欧美13videosex性极品| 久草综合在线观看| www.男人天堂网| 日本午夜精品一区二区| 国产伦精品一区二区三区视频免费| 国产精品jizz在线观看麻豆| 久久中文字幕在线视频| 久久成年人视频| 高清欧美电影在线| 九九精品视频在线| 欧美变态tickle挠乳网站| 日韩精品一区二区三区蜜臀| 欧美午夜精品一区| 欧美一区二区三区白人 | 91老司机在线| 国产一区二区在线免费| 亚洲男人av在线| 久久亚洲精品中文字幕冲田杏梨 | 久久久久成人精品免费播放动漫| 91免费视频网站| 久久资源av| 日韩精品无码一区二区三区免费 | jlzzjlzz欧美大全| 四虎成人免费在线| 天堂av在线电影| 91豆花视频在线播放| 日本免费黄视频| 免费羞羞视频| 国产三级电影在线观看| 视频在线这里都是精品| 国产精品一区免费在线| 99精品全国免费观看视频软件| 国产精品久久国产愉拍| 26uuu亚洲| 在线一区二区三区四区五区| 欧美乱妇15p| 久久伊人精品天天| 国产精品美女久久久久av福利| 国产一区在线播放| 国产 欧美 日本| 性xxxx丰满孕妇xxxx另类| 久久久男人天堂| 91精品电影| 丁香一区二区三区| 91美女在线观看| 欧美精品色综合| 久久久久久久久久久91| 欧美一区二区在线视频观看| 欧美成人免费高清视频| 啊啊啊久久久| 亚洲一区国产| 国产一区二区网址| 精品婷婷伊人一区三区三| 一本一本久久a久久精品牛牛影视| 亚洲精品国产成人| 国产啪精品视频| 超碰在线免费看| 国产精品一区二区99| 91麻豆国产香蕉久久精品| 欧美mv日韩mv亚洲| 午夜老司机精品|