文件 IO 2月18日学习笔记

这篇具有很好参考价值的文章主要介绍了文件 IO 2月18日学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

标准IO和文件IO的区别:
    1.标准IO是库函数,是对系统调用的封装
    2.文件IO是系统调用,是Linux内核中的函数接口
    3.标准IO是有缓存的
    4.文件IO是没有缓存的

文件IO:
    1.操作步骤:
        打开 -> 读/写 -> 关闭
    
    2.打开文件:
        open 接口有两种形式
        int open(const char *pathname, int flags);
        int open(const char *pathname, int flags, mode_t mode);
        功能:
            打开文件并且获得文件描述符
        参数:
            pathname:要打开的文件名
            flags:标志位
                O_RDONLY    只读
                O_WRONLY    只写
                O_RDWR      读写
                
                O_APPEND    追加
                O_ASYNC     异步IO
                O_CREAT     文件不存在创建
                O_TRUNC     文件存在截断(清0)

  • mode是一个无符号整数,用于设置新创建的文件的访问权限。只有在使用O_CREAT标志位创建新文件时才需要设置权限。可以使用S_IRUSRS_IWUSRS_IRGRPS_IWGRPS_IROTHS_IWOTH等标志位进行组合。

        返回值:
            成功返回文件描述符(很小的非负整数)
            失败返回-1 

        新生成的文件描述符总是为尚未被使用的最小的非负整数

有三个预先定义的文件描述符:

  • 0:标准输入文件描述符(stdin)
  • 1:标准输出文件描述符(stdout)
  • 2:标准错误文件描述符(stderr)

这些文件描述符通常保留给应用程序的标准输入、标准输出和标准错误流。

#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(void)
{
	int fd = 0;
	
//	0664
//	rw-rw-r--
//0664:该参数将设置新创建文件的访问权限为 "rw-rw-r--",其中:
//0表示权限位的起始标志。
//6表示文件所有者具有读写权限。
//4表示文件所有者所在组具有读权限。
//4表示其他用户具有读权限。
//	fd = open("a.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);		//w
//	fd = open("a.txt", O_RDONLY);								//r
//	fd = open("a.txt", O_RDWR);									//r+
//	fd = open("a.txt", O_RDWR | O_CREAT | O_TRUNC, 0664);		//w+	
//	fd = open("a.txt", O_WRONLY | O_CREAT | O_APPEND, 0664);	//a
	
	while (1)
	{
		fd = open("a.txt", O_RDWR | O_CREAT | O_APPEND, 0664);		//a+
		if (-1 == fd)
		{
			perror("fail to open");
			return -1;
		}
	
		printf("fd = %d\n", fd);
	}

	return 0;
}

  3.关闭文件:
        close 
        int close(int fd);
        功能:
            将fd对应的文件描述符关闭

 4.读写:
        read/write 
        1.write
          ssize_t write(int fd, const void *buf, size_t count);
          功能:
            向fd对应的文件中写入buf指向的count个字节
          参数:
            fd:文件描述符
            buf:写入数据空间首地址
            count:写入的字节数
          返回值:
            成功返回实际写入字节数
            失败返回-1 

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
	int fd = 0;
	char tmpbuff[4096] = {"hello world"};

	fd = open("a.txt", O_WRONLY | O_TRUNC | O_CREAT, 0664);
	if (-1 == fd)
	{
		perror("fail to open");
		return -1;
	}

	write(fd, tmpbuff, strlen(tmpbuff));

	close(fd);

	return 0;
}

        2.read 
          ssize_t read(int fd, void *buf, size_t count);
          功能:
            从文件描述符fd对应的文件中读取count个字节存放到buf开始的空间中
          参数:
            fd:文件描述符 
            buf:存放数据空间的首地址
            count:想要读取数据字节数
          返回值:   
            成功返回实际读到的字节数
            失败返回-1 
            读到文件末尾返回0 

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main(void)
{
	int fd = 0;
	ssize_t nret = 0;
	char tmpbuff[4096] = {0};

	fd = open("a.txt", O_RDONLY);
	if (-1 == fd)
	{
		perror("fail to open");
		return -1;
	}

	nret = read(fd, tmpbuff, sizeof(tmpbuff));
	printf("nret = %ld\n", nret);
	printf("tmpbuff = %s\n", tmpbuff);

	close(fd);

	return 0;
}

eg1:利用read和write实现文件内容的拷贝(将src.jpg中的内容拷贝到dst.jpg文件中)

#ifndef __HEAD_H__
#define __HEAD_H__

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

#endif
#include "head.h"

int main(int argc, const char *argv[])
{
	int fsrc = 0;
	int fdst = 0;
	char tmpbuff[4096] = {0};
	ssize_t nret = 0;

	if (argc != 3)
	{
		fprintf(stderr, "Usage:./a.out srcfilename dstfilename\n");
		return -1;
	}

	fsrc = open(argv[1], O_RDONLY);
	if (-1 == fsrc)
	{
		perror("fail to open");
		return -1;
	}

	fdst = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0664);
	if (-1 == fdst)
	{
		perror("fail to open");
		return -1;
	}

	while (1)
	{
		nret = read(fsrc, tmpbuff, sizeof(tmpbuff));
		if (nret <= 0)
		{
			break;
		}

		write(fdst, tmpbuff, nret);
	}
	
	close(fsrc);
	close(fdst);

#if 0
	int i = 0;

	printf("argc = %d\n", argc);
	for (i = 0; i < argc; i++)
	{
		printf("argv[%d] = %s\n", i, argv[i]);
	}
#endif

	return 0;
}

eg2:某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。

输出格式:

在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。文章来源地址https://www.toymoban.com/news/detail-825934.html

#include "head.h"

typedef struct person
{
	char name[8];
	char birthday[12];
}person_t;

int main(void)
{
	person_t a[100000];
	int n = 0;
	int i = 0;
	int cnt = 0;
	char maxvalue[12] = {"2014/09/06"};
	char minvalue[12] = {"1814/09/06"};
	int curmax = 0;
	int curmin = 0;

	scanf("%d", &n);
	
	for (i = 0; i < n; i++)
	{
		scanf("%s%s", a[i].name, a[i].birthday);
	}

	for (i = 0; i < n; i++)
	{
		if (strcmp(a[i].birthday, maxvalue) <= 0 && strcmp(a[i].birthday, minvalue) >= 0)
		{
			cnt++;
			
			if (1 == cnt)
			{
				curmax = curmin = i;
			}
			
			if (strcmp(a[i].birthday, a[curmax].birthday) > 0)
			{
				curmax = i;
			}

			if (strcmp(a[i].birthday, a[curmin].birthday) < 0)
			{
				curmin = i;
			}
		}
	}

	printf("%d %s %s\n", cnt, a[curmin].name, a[curmax].name);

	return 0;
}

到了这里,关于文件 IO 2月18日学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 标准IO 2月4日学习笔记

    IO输入输出,操作对象是 文件 Linux文件类型:         b   block       块设备文件                         按块扫描设备信息的文件                         存储设备         c   character   字符设备文件                         按字符扫描设备信息的文件         

    2024年02月19日
    浏览(34)
  • 目录IO 2月19日学习笔记

     1. lseek        off_t lseek(int fd, off_t offset, int whence);        功能:             重新设定文件描述符的偏移量        参数:             fd:文件描述符             offset:偏移量             whence:                 SEEK_SET    文件开头                 SEEK_CUR    文件当前

    2024年02月20日
    浏览(33)
  • React18 hook学习笔记

    useState useState用于在函数组件中声明和管理状态 它接受初始状态,并返回一个状态变量和一个更新状态的函数 通过调用更新状态的函数,可以改变状态的值并触发组件的重新渲染 useEffect React的useEffect钩子可以让开发者在函数组件中管理副作用。 副作用操作是指那些与组件渲

    2024年02月14日
    浏览(37)
  • lua学习笔记18(面相对象之多态)

    输出  

    2024年04月13日
    浏览(34)
  • Flutter 笔记 | Flutter 文件IO、网络请求、JSON、日期与国际化

    Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的,不过和 Dart VM 相比,Flutter 有一个重要差异是文件系统路径不同,这是因为 Dart VM 是运行在 PC 或服务器操作系统下,

    2024年02月07日
    浏览(100)
  • WPF实战学习笔记18-优化设计TodoView

    修复新增项目无法编辑问题 更新MyToDo.Api/Service/ToDoService.cs 更新MyToDo.Api/Service/MemoService.cs 增加了对完成状态的区分 更新MyToDo.Api/Service/TodoView.xaml 增加了选项卡删除功能 更新删除请求URI 更新MyToDo.Api/Service/Baservice.cs 添加删除命令并初始化 更新文件:MyToDo/ViewModel/TodoViewModel.cs

    2024年02月15日
    浏览(38)
  • JAVA基础学习笔记-day15-File类与IO流

    博文主要是自己学习JAVA基础中的笔记,供自己以后复习使用,参考的主要教程是B站的 尚硅谷宋红康2023大数据教程 老骥伏枥,志在千里 --曹操《龟虽寿》 1.1 概述 File类及本章下的各种流,都定义在 java.io 包下。 一个File对象代表硬盘或网络中可能存在的一个文件或者文件目

    2024年01月21日
    浏览(38)
  • Linux shell编程学习笔记18:while循环语句

    上回我们研究和探讨了Linux shell编程中for 循环语句,与在C/C++中一样,for 循环语句Linux shell编程中有很多灵活的用法。今天我们来研究和探讨while循环语句。 我们继续以for循环语句中的例子,计算 从1到10与2的乘积 并输出。 1.在zsh命令行中 # csdn @ edu in ~ [20:35:57]  $ i=1; while

    2024年02月06日
    浏览(55)
  • ad18学习笔记三:关于测量点对点

    如何测量? 方法有很多种,比如 1、 点击 ‘放置’–》‘尺寸’–》‘线性尺寸’ 2、 快捷工具栏  3、 快捷键 AD如何使用测量命令?-凡亿课堂 AD中的三种测量距离的方式 清除测量标线? 这个简单,在显示测量结果的提示框上就提示了怎么做,shift+c 这个时候,你应该先推

    2024年02月06日
    浏览(44)
  • 23年5月高项学习笔记18 —— 通用组织管理

    2-4分选择题 人力资源管理:         规划:         招聘:         维护:工作积极性         提升:         评价: 工作分析四个阶段         明确工作分析范围         确定工作分析方法         工作信息收集和分析         评估工作分析方法 工作分析方法分为

    2023年04月26日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包