一个简单的文件读写实例

1.打开文件与关闭文件

    (1)linux中的文件描述符fd的合法范围是0或者一个正正数,不可能是一个负数。

    (2)open返回的fd程序必须记录好,以后向这个文件的所有操作都要靠这个fd去对应这个文件,最后关闭文件时也需要fd去指定关闭这个文件。如果在我们关闭文件前fd丢掉了那就惨了,这个文件没法关闭了也没法读写了。

2.实时查man手册

    (1)当我们写应用程序时,很多API原型都不可能记得,所以要实时查询,用man手册

    (2)man 1 xx查linux shell命令,man 2 xxx查API, man 3 xxx查库函数    

3.读取文件内容

(1)ssize_t read(int fd, void *buf, size_t count);
fd表示要读取哪个文件,fd一般由前面的open返回得到
buf是应用程序自己提供的一段内存缓冲区,用来存储读出的内容
count是我们要读取的字节数
返回值ssize_t类型是linux内核用typedef重定义的一个类型(其实就是int),返回值表示成功读取的字节数。


3.1.3.4、向文件中写入

(1)写入用write系统调用,write的原型和理解方法和read相似
(2)注意const在buf前面的作用,结合C语言高级专题中的输入型参数和输出型参数一节来理解。
(3)注意buf的指针类型为void,结合C语言高级专题中void类型含义的讲解


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
	int fd = 1;
	char buf[100] = {0};
	char wbuf[20] = {"I love linux."};
	int ret = -1;
	fd = open("a.txt",O_RDWR);
	
	if(-1 == fd ) //fd < 0
	{
		printf("File Open Error.\n");
	}
	else
	{
		printf("File Open Succeed. fd = %d\n",fd);
	}
	
	ret = write(fd,wbuf,strlen(wbuf));
	if(ret < 0)
	{
		printf("Write Error.\n");
	}
	else
	{
		printf("write %d byte.\n",ret);
		printf("write context is [%s]\n",wbuf);
	}

	ret = read(fd,buf,30);
        if(-1 == ret)
        {
                printf("Read Error.\n");
        }
        else
        {
                printf("read %d byte.\n",ret);
                printf("The context is [%s]\n",buf);
        }

	close(fd);
	return 0;
}
(4)刚才写入成功,然后读出结果读出是0(但是读出成功了),这个问题的答案是因为write和read在使用时是从当前指针开始往后写的,当上面write完后,文件指针已经移动到了文件末尾,所以在接下来的read操作时已经到最末尾了,就没有字节可读。这时候需要使用lseek()来定位操作文件指针置于文件开头。   

猜你喜欢

转载自blog.csdn.net/a249093278/article/details/80940048