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$

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

 

 

原文地址:https://www.cnblogs.com/han-bing/p/6033893.html