• Linux学习笔记(6)-文件I/O


      持续一个礼拜的出差终于结束了,本次出差真是收益良多,不仅品尝了正宗的大闸蟹,同时也是第一次体验了产品的现场实施流程。

      明天开始继续学习Linux!

      ——————————————————————分割线————————————————————————————————————

      因为各种原因,已经有十天没有更新了,真是太不应该了,以后一定杜绝这种懒惰、无耻的情况!!

      ——————————————————————分割线————————————————————————————————————

      古话说得好,在Linux之下,一切皆是文件。

      有很多资源,Linux都可以用文件的方式来使用,在以前的单片机开发中,也使用过文件系统,稍稍有那么一些经验,所以在这点上的学习,应该难不倒我……

      在Linux下,常用的文件操作也无外乎,open,wirte,read,seek之类的。

      要使用这些函数,需要包含以下头文件:

      #include<sys/types.h> // 定义了一些数据类型

      #include<fcntl.h> // 定义了open,create函数的原形,创建文件权限的宏S_IRUSR等

      #include<unistd.h> // 这里面定义了write,read,seek等函数原形

      #include<errno.h>// 这个主要是用来调试用的,里面有一个变数,如果出了错误,那就能用到

      ……

      简单浏览了一下这些函数的接口,下面开始写代码……

      功能:创建一个名为IO_Opreation.txt的文件,在里面写一句话,然后关闭,在读回来。

         

     1 #include<sys/types.h>
     2 #include<fcntl.h>
     3 #include<unistd.h>
     4 #include<errno.h>
     5 
     6 void main(void)
     7 {
     8   int fd;
     9   char filename[] = {"io_opreation.txt"};
    10   char writedate[] = {"你好啊!"};
    11   char readdate[100];
    12 
    13 
    14   fd = open(filename,O_WRONLY|O_CREAT,0x777);
    15   write(fd,writedate,sizeof(writedate));
    16   close(fd);
    17   fd = open(filename,O_RDONLY);
    18   read(fd,readdate,10);
    19 
    20   return 0;
    21 }

      程序写完了,简直完美!!!

      现在开始写makefile

      花了半个小时,makefile也完工了:

     1 EXE=io_opreation
     2 SRC=io_opreation.c
     3 OBJ=io_opreation.o
     4 
     5 cc=gcc
     6 CFLAG=-g
     7 LCDFLAG=
     8 
     9 
    10 EXE:$(OBJ)
    11   $(cc) $(LCDFLAG) $(SRC) -o $(EXE)
    12 
    13 OBJ:$(SRC)
    14   $(cc) -c $(SRC) -o $(OBJ)
    15 
    16 .PHONY:clean
    17 clean:
    18   rm -vfr $(OBJ) $(EXE)

      编译一下……咦?

      io_opreation.c:20:2: 警告: 在无返回值的函数中,‘return’带返回值 [默认启用]
      哦哦哦!原来如此,都怪自己手贱!

     1 #include<sys/types.h>
     2 #include<fcntl.h>
     3 #include<unistd.h>
     4 #include<errno.h>
     5 
     6 void main(void)
     7 {
     8     int fd;
     9     char filename[] = {"io_opreation.txt"};
    10     char writedate[] = {"你好啊!"};
    11     char readdate[100];
    12 
    13 
    14     fd = open(filename,O_WRONLY|O_CREAT,0x777);
    15     write(fd,writedate,sizeof(writedate));
    16     close(fd);
    17     fd = open(filename,O_RDONLY);
    18     read(fd,readdate,10);
    19 
    20     return;
    21 }

      把返回值的零删掉,再试一下!

    cc -c -o io_opreation.o io_opreation.c
    gcc io_opreation.c -o io_opreation

    一切大丈夫!!

    现在执行一下……

    我擦!执行以后怎么什么反应都没有???

    原来我都没有输出!

    修改代码,将读回来的东西,打印出来……对了最后还得调用close函数把文件关了(这算是个bug!需要review!!)。

     

     1 #include<sys/types.h>
     2 #include<fcntl.h>
     3 #include<unistd.h>
     4 #include<errno.h>
     5 #include<stdio.h>
     6 void main(void)
     7 {
     8     int fd;
     9     char filename[] = {"io_opreation.txt"};
    10     char writedate[] = {"你好啊!"};
    11     char readdate[100];
    12 
    13 
    14     fd = open(filename,O_WRONLY|O_CREAT,0x777);
    15     write(fd,writedate,sizeof(writedate));
    16     close(fd);
    17     fd = open(filename,O_RDONLY);
    18     read(fd,readdate,20);
    19     close(fd);
    20 
    21     printf("%s
    ",readdate);
    22 
    23     return;
    24 }

    再度编译,执行!!

    vmuser@Linux-host:~/work/IO_opreation$ ./io_opreation
    你好啊▒

    代码执行以后,输出倒是有了……但是好像哪里有点不对!那个奇怪的符号是哪里冒出来的?

    read函数读出了乱码,赶紧check代码……

    根据我调查,可能是由于read函数指定的读取字节数不够,因为我改成read(fd,O_RDONLY,20)之后,就不存在那个乱码了!

     

    文件也是按照要求创建出来了。
    vmuser@Linux-host:~/work/IO_opreation$ ./io_opreation
    你好啊!
    vmuser@Linux-host:~/work/IO_opreation$

    如果有知道原理的朋友,看见了一定告诉我一下,我会很感激的!

     

     

  • 相关阅读:
    WPF Style和Template
    WPF自定义命令
    Vue-cli proxyTable 解决开发环境的跨域问题
    mongoose 获取某个存在的collecion 里的数据
    express+mongodb+mongoose简单入门
    服务器环境配置nginx / php / php-fpm(一)
    vue 循环前十条数据
    nodejs express的基本用法
    nodejs querystring
    nodejs fs.readFile
  • 原文地址:https://www.cnblogs.com/han-bing/p/6033893.html
Copyright © 2020-2023  润新知