• Linux学习——文件IO


    目录

    一、文件IO的概念:

    二、文件描述符概念:

    三、文件IO 打开

    四、文件的关闭

     五、文件IO的读写和定位

    六、使用文件IO实现“每隔1秒向文件1.txt写入当前系统时间,行号递增”


    一、文件IO的概念:

    什么是文件IO,又称系统IO,系统调用

    是操作系统提供的API接口函数。

    POSIX接口 (了解)

    注意:文件IO不提供缓冲机制

    文件IO的API

    open  close read read

    二、文件描述符概念:

    英文:缩写fd(file descriptor)

    是0-1023的数字,表示文件。

    0, 1, 2 的含义 标准输入,标准输出,错误

    三、文件IO 打开

    open

    int open(const char *pathname, int flags);   不创建文件

    int open(const char *pathname, int flags, mode_t mode);  创建文件,不能创建设备文件

    成功时返回文件描述符;出错时返回EOF

    文件IO和标准的模式对应关系:

    r                                O_RDONLY

    r+                              O_RDWR

    w                               O_WRONLY | O_CREAT | O_TRUNC, 0664

    w+                             O_RDWR | O_CREAT | O_TRUNC, 0664

    a                                O_WRONLY | O_CREAT | O_APPEND, 0664

    a+                              O_RDWR | O_CREAT | O_APPEND, 0664

    umask概念:

    umask 用来设定文件或目录的初始权限

    四、文件的关闭

    int close(int fd)

    关闭后文件描述符不能代表文件

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main(int argc,char *argv[]){
    7. int fd;
    8. int ret;
    9. fd = open("test.txt",O_WRONLY|O_CREAT|O_TRUNC, 0666);
    10. if(fd<0){
    11. printf("open file err\n");
    12. return 0;
    13. }
    14. printf("sucess,fd=%d\n",fd);
    15. ret= close(fd);
    16. if(ret<0){
    17. printf("close failed\n");
    18. }
    19. ret=close(fd);
    20. printf("ret=%d\n",ret);
    21. }

     五、文件IO的读写和定位

    容易出错点:

    求字符串长度使用sizeof,对二进制数据使用strlen

    printf 的字符最后没有’\0’

    六、使用文件IO实现“每隔1秒向文件1.txt写入当前系统时间,行号递增”

    程序:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. int main()
    9. {
    10. int i = 0,fd,ret;
    11. time_t times;
    12. char buf[32];
    13. struct tm* ge;
    14. fd = open("test.txt",O_RDWR | O_CREAT|O_APPEND, 0666);
    15. if(fd<0){
    16. printf("open file err\n");
    17. return 0;
    18. }
    19. /*
    20. while(fgets(buf,32,fp) != NULL)
    21. {
    22. if(buf[strlen(buf)-1] == '\n')
    23. {
    24. i++;
    25. }
    26. }
    27. */
    28. char buf1[32];
    29. while(read(fd,buf1,32))
    30. {
    31. for(int j = 0;j <32;j++)
    32. if(buf1[j] == '\n'){
    33. i++;
    34. }
    35. }
    36. lseek(fd,0,SEEK_SET);
    37. while(1){
    38. times = time(NULL);
    39. //printf("%d\n",(int)times);
    40. ge = localtime(×);
    41. printf("%2d:%4d-%2d-%2d %2d:%2d:%2d\n",i,ge->tm_year+1900,ge->tm_mon+1,ge->tm_mday,ge->tm_hour,ge->tm_min,ge->tm_sec);
    42. sprintf(buf,"%2d:%4d-%2d-%2d %2d:%2d:%2d\n",i,ge->tm_year+1900,ge->tm_mon+1,ge->tm_mday,ge->tm_hour,ge->tm_min,ge->tm_sec);
    43. ret=write(fd,buf,strlen(buf));
    44. if(ret<0){
    45. perror("write");
    46. goto END;
    47. }
    48. i++;
    49. sleep(1);
    50. }
    51. END:
    52. close(fd);
    53. }

    实验结果:

  • 相关阅读:
    SAP Commerce Cloud Accelerator 的响应式 Theme 介绍
    MySQL之搭建主从复制
    葡萄糖-聚乙二醇-阿奇霉素,Azithromycin-PEG-Glucose
    HDFS 分布式环境搭建
    总体最小二乘法(TLS)
    xxl-job源码—调度器/执行器工作原理
    Java 获取本地ip网卡信息
    数据结构练习题——图(算法设计题)
    Java 21 新特性:Unnamed Patterns and Variables
    2023年6月电子学会Python等级考试试卷(五级)答案解析
  • 原文地址:https://blog.csdn.net/qq_52479948/article/details/127695382