• lv4 嵌入式开发-2 Linux文件IO


    1 文件的打开

    1.1 标准I/O - 打开文件

    下列函数可用于打开一个标准I/O流:

    1. FILE *fopen (const char *path, const char *mode);
    2. 成功时返回流指针;出错时返回NULL

     标准I/O – fopen – mode参数

     

    示例

    1. #include <stdio.h>
    2. int main(int argc, char *argv[])
    3. {
    4. FILE *fp;
    5. if ((fp = fopen(“test.txt”, “r+”)) == NULL) {
    6. printf(“fopen error\n”);
    7. return -1;
    8. }
    9. ……
    10. return 0;
    11. }

    1.2 fopen – 新建文件权限

    1. fopen() 创建的文件访问权限是0666(rw-rw-rw-)

    Linux系统中umask设定会影响文件的访问权限,其规则为(0666 & ~umask)
    Root用户是 022 普通用户是002用户可以通过umask函数或者命令修改相关设定

    如果希望umask不影响文件访问权限,该如何设定?

    1.3 处理错误信息

    1. extern int errno;
    2. void perror(const char *s);
    3. char *strerror(int errno);

    errno 存放错误号,由系统生成

    perror先输出字符串s,再输出错误号对应的错误信息

    strerror根据错误号返回对应的错误信息

     

     示例1:

    1. #include
    2. int main(int argc, char *argv[])
    3. {
    4. FILE *fp;
    5. if ((fp = fopen(“test.txt”, “r+”)) == NULL) {
    6. perror(“fopen:”);
    7. return -1;
    8. }
    9. ……
    10. fopen: No such file or directory
    11. //成功失败都返回的方式
    12. #include
    13. int main(int argc,char *argv[]){
    14. FILE *fp;
    15. fp = fopen("1.txt","r");
    16. if(fp==NULL){
    17. //printf("Open file Failed\n");
    18. perror("fopen:");
    19. }else{
    20. perror("fopen:");
    21. }
    22. }
    23. fopen: Sunccess
    24. fopen: No such file or directory

    示例2:

    1. #include
    2. #include
    3. #include
    4. int main(int argc, char *argv[])
    5. {
    6. FILE *fp;
    7. if ((fp = fopen(“test.txt”, “r+”)) == NULL) {
    8. printf(“fopen: %s\n”, strerror(errno));
    9. return -1;
    10. }
    11. ……
    12. fopen: No such file or directory

    示例3:

    1. #include
    2. #include
    3. #include
    4. int main(int argc,char *argv[]){
    5. FILE *fp;
    6. int fpret;
    7. fp = fopen("1.txt","r");
    8. if(fp==NULL){
    9. perror("fopen");
    10. printf("fopen:%s\n",strerror(errno));
    11. }else{
    12. printf("Open file success\n");
    13. }
    14. }

     

    2 文件的关闭

    2.1 标准I/O – 关闭文件

    1. int fclose(FILE *stream)
    • fclose()调用成功返回0,失败返回EOF,并设置errno
    • 流关闭时自动刷新缓冲中的数据并释放缓冲区
    • 当一个程序正常终止时,所有打开的流都会被关闭。
    • 流一旦关闭后就不能执行任何操作

    示例

    1. #include
    2. #include
    3. #include
    4. int main(int argc,char *argv[]){
    5. FILE *fp;
    6. int fpret;
    7. fp = fopen("1.txt","r");
    8. if(fp==NULL){
    9. //printf("Open file Failed\n");
    10. perror("fopen");
    11. printf("fopen:%s\n",strerror(errno));
    12. }else{
    13. printf("Open file success\n");
    14. // perror("open");
    15. fpret = fclose(fp);
    16. if(fpret==0){
    17. printf("file close sucess\n");
    18. }else{
    19. perror("fclose");
    20. }
    21. }
    22. }

    注意fclose传入得* stream不能为空

    3 思考和练习

    程序中能够打开的文件或流的个数有限制,如何测试?      

    思路:循环打开流,成功则计数器累加,直到出错为止      

    1. #include
    2. #include
    3. #include
    4. #define F_PATH "./1.txt"
    5. int main(int argc,char *argv[]){
    6. FILE *fp;
    7. int count = 0;
    8. while(1)
    9. {
    10. fp = fopen(F_PATH,"r");
    11. if(fp==NULL){
    12. printf("fopen:%s\n",strerror(errno));
    13. printf("count :%d\n",count);
    14. break;
    15. }
    16. else
    17. {
    18. //perror("fopen:");
    19. count ++;
    20. }
    21. }
    22. return 0;
    23. }

    答案:1021 + stdin + stdout + stderr = 1024

  • 相关阅读:
    ASO优化之什么原因会导致关键词落榜?
    TIA博途中已经被调用的变量,为什么交叉引用时却没有显示调用信息?
    会话管理 : Cookie和Session
    阿里云WAF应用防火墙核心概念与购买使用
    每日一题 1333. 餐厅过滤器(中等)
    react native 集成腾讯语音合成TTS
    关于信息熵的理解
    .NET开源、强大的Web报表统计系统
    垃圾回收系统小程序定制开发搭建攻略
    解密Prompt7. 偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析
  • 原文地址:https://blog.csdn.net/m0_60718520/article/details/132781192