linux知識點,10-12Linux流編程的一些知識點

 2023-12-06 阅读 31 评论 0

摘要:第五章? Linux 的流編程 Linux流操作基礎 ?? ? 流和文件的關系:流相當于一個緩沖區,可以將文件描述符和流關聯,獲得相應的緩沖區,以此來提高系統對磁盤的存取速度。 ?? ?流的結構和操作流程:流操作函數的操作對象不是一個文件描述符࿰
第五章? Linux 的流編程

Linux流操作基礎
?? ? 流和文件的關系:流相當于一個緩沖區,可以將文件描述符和流關聯,獲得相應的緩沖區,以此來提高系統對磁盤的存取速度。
?? ?流的結構和操作流程:流操作函數的操作對象不是一個文件描述符,而是一個緩沖區,這個緩沖區帶有打開文件的所有信息,以及緩沖區的有關信息。
?? ?標準流:#define STDIN_FILENO ?? ?0?? ?//標準輸入,一般是鍵盤
?? ??? ?#define STDOUT_FILENO ?? ?1?? ?//標準輸出,一般是顯示器
?? ??? ?#define STDERR_FILENO?? ?2?? ?//標準錯誤輸出,一般是顯示器
?? ?流的打開和關閉函數:
?? ??? ?#include <stdio.h>
?? ??? ?FILE *fopen(const char *path, const char *mode);
?? ??? ?FILE *fdopen(int fd, const char *mode);
?? ??? ?FILE *freopen(const char *path, const char *mode, FILE *stream);
?? ??? ?int fclose(FILE *fp);
?? ?mode:?? ?r或rb:只讀,文件必須存在
?? ??? ?w或rw:只寫,如果文件存在,則重寫,如果不存在,則建立。?? ?
?? ??? ?a或ab:添加打開,如果文件存在,則緊接著文件末尾輸入;否則,建立新文件。linux知識點。
?? ??? ?r+,rb+,r+b:讀寫打開。文件必須存在,打開后,文件內容不變,文件指針指向文件頭。
?? ??? ?w+,wb+,w+b:更新打開。若文件存在,則長度截為0,否則,創建新文件。編程知識點總結,
?? ??? ?a+,ab+, a+b:更新打開。若文件存在,其內容不變,若不存在,建立新文件。如果是讀,則從文件開頭讀,如果寫,則追加到文件末尾。
?? ?流的緩沖方式和緩沖區設置:
?? ??? ?#include <stdio.h>
?? ??? ?int fileno(FILE *fp);
?? ?流的緩沖區設置方式:
?? ??? ?#include <stdio.h>
?? ??? ?void setbuf(FILE *stream, char *buf);
?? ??? ?int setvbuf(FILE *stream, char *buf, int mode, size_t size);
?? ??? ?void setbuffer(FILE *stream, char *buf, size_t size);
?? ??? ?void setlinebuf(FILE *stream);
?? ?流的讀寫:
?? ??? ?字符讀寫:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?int fgetc(FILE *stream);//不能被實現為宏
?? ??? ??? ?int getc(FILE *stream);//可被實現為宏
?? ??? ??? ?int getchar(void);
?? ??? ??? ?int fputc(int c, FILE *stream);//不能實現為宏
?? ??? ??? ?int putc(int c, FILE *stream);//可被實現為宏
?? ??? ??? ?int putchar(int c);//相當于int putc(int c, FILE stdout);
?? ??? ?行讀寫:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?char *fgets(char *s, int size, FILE *stream);//設置的緩沖區大小為size,總是以NULL結尾
?? ??? ??? ?char *gets(char *s);//從標準緩沖區讀,不支持使用,因為沒有設置緩沖區大小,容易導致緩沖區溢出
?? ??? ??? ?int *fputs(const char *s, FILE *stream);//將一個以NULL結尾的字符串去掉NULL以后寫入stream中,并不要求每次寫一行,因為它并不要求NULL之前必須是換行符?? ?
?? ??? ??? ?int *puts(const char *s);//將NULL去掉,并加上一個換行符輸出到標準輸出,所以應該盡量避免使用,以免導致錯誤
?? ??? ?二進制讀寫(塊/結構):
?? ??? ??? ?size_t fread(void *buf, size_t size, size_t nmemb, FILE *stream);
?? ??? ??? ?size_t fwrite(const void *buf, size_t size, size_t nmemb, FILE *stream);
?? ??? ??? ?注意:塊讀寫只能在同一系統下使用,否則可能會因為系統對結構體數據存儲方式不同,以及結構體偏移量不同而產生錯誤。shell編程入門。
?? ??? ?流的出錯處理:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?int feof(FILE *stream);//檢查是否到達文件尾
?? ??? ??? ?int ferror(FILE *stream);//檢查時候出現錯誤
?? ??? ??? ?void clearerr(FILE *stream);//清除流的錯誤
?? ??? ?流的沖洗:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?int fflush(FILE *stream);
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?#include <stdio_ext.h>
?? ??? ??? ?int _fpurge(FILE *stream);
?? ??? ?注意:fflush函數會在調用fclose()函數關閉流或者在一個進程被關閉之后自動調用,不需要手動去調用。
?? ??? ?流的定位:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?int fseek(FILE *stream, long offset, int whence);//指定偏移量
?? ??? ??? ?long ftell(FILE *stream);//返回當前偏移量
?? ??? ??? ?void rewind(FILE *stream);//定位到文件頭
?? ??? ??? ?int fseeko(FILE *stream, off_t offset, int whence);//文本文件定位偏移量
?? ??? ??? ?off_t ftello(FILE *stream);//返回當前偏移量
?? ??? ?fgetpos和fsetpos函數:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?int fgetpos(FILE *stream, fpos_t *pos);
?? ??? ??? ?int fsetpos(FILE *stream, fpos_t *pos);//這兩個函數和fseek,ftell的主要區別是偏移量使用了抽象的pos_t結構體來存放了,這樣的好處是在不同的系統上方便了一些。
?? ?流的格式化輸入和輸出:
?? ??? ?格式化輸出:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?int printf(const char *format, ...);
?? ??? ??? ?int fprintf(FILE *stream, const char *format, ...);
?? ??? ??? ?int sprintf(char *str, const char *format, ...);?? ?
?? ??? ??? ?int snprintf(char *str, size_t size, const char *format, ...);
?? ??? ??? ?#include <stdarg.h>
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?//以下幾個和上面的4個的區別是后面的參數列表是一個指向一系列參數的指針
?? ??? ??? ?int vprintf(char *format, va_list arg_ptr);
?? ??? ??? ?int vfprintf(FILE *stream, const char *format, va_list arg_ptr);
?? ??? ??? ?int vsprintf(char *str, const char *format, va_list arg_ptr);
?? ??? ??? ?int vsnprintf(char *str, size_t size, const char *format, va_list arg_ptr);
?? ??? ??? ?//返回值要么是輸出的字符數,要么是一個負值
?? ??? ?格式化輸入:
?? ??? ??? ?#include <stdio.h>
?? ??? ??? ?int scanf(const char *format, ...);
?? ??? ??? ?int fscanf(FILE *stream, const char *format, ...);
?? ??? ??? ?int sscanf(const char *str, const char *format, ...);
?? ??? ??? ?#include <stdarg.h>
?? ??? ??? ?int vscanf(const char *format, va_list arg_ptr);
?? ??? ??? ?int vfscanf(FILE *stream, const char *format, va_list arg_ptr);
?? ??? ??? ?int vsscanf(const char *str, const char *format, va_list arg_ptr);
?? ??? ?格式化參數:
?? ??? ??? ?注意:區分:“空白符”, “空格符”, “空字符”。空白符包括空格符,制表符,水平制表符, 換行符, 走紙符,即isspace()函數返回值為真的字符;空格符是一個“ ”, 空字符是NULL,即'\0'。數控編程題庫和答案、
?? ????

轉載于:https://www.cnblogs.com/StivenYang/p/8441329.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/192011.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息