Linux C高级编程——文件操作之库函数

Linux C高级编程——文件操作库函数


宗旨:技术的学习是有限的,分享的精神是无限的


——为什么要设计标准I/O库?

直接使用API进行文件访问时,需要考虑许多细节问题

例如:read、write时,缓冲区的大小该如何确定,才能使效率最优

标准I/O库封装了诸多细节问题,包括缓冲区分配

 

——标准I/O库缓冲

标准I/O库提供缓冲的目的:尽可能减少使用read、write调用的次数,以提高I/O效率。

通过标准I/O库进行的读写操作,数据都会被放置在标准I/O库缓冲中中转。

 

——缓冲类型

—全缓冲

在填满标准I/O缓冲区后,才进行实际I/O操作(例如调用write函数)

调用fflush函数也能强制进行实际I/O操作

—行缓冲

在输入和输出遇到换行符时,标准I/O库执行I/O操作

因为标准I/O库用来收集每一行的缓存的长度是固定的,所以,只要填满了缓存,即使没有遇到新行符,也进行I/O操作

终端(例如标准输入和标准输出),使用行缓冲

—不带缓冲

标准I/O库不对字符进行缓冲存储

标准出错是不带缓冲的,为了让出错信息尽快显示出来

 

——流的定向

对于ASCII字符集,一个字符用一个字节表示

对于国际字符集,一个字符可用多个字节表示

流的定向决定了所读、写的字符是单字节还是多字节的 

 

一、打开关闭文件

1fopen

——用于打开一个指定的文件

(1)函数原型

#include<stdio.h>
FILE* fopen(const char *restrict pathname, const char *restrict type);

(2)参数

        pathname:要打开的文件名

        type:指定文件的读、写方式

r/rb——只读方式打开

w/wb——只写,不存在则创建,使文件长度为0

a/ab——追加

r+/r+b/rb+——读写打开

W+/w+b/wb+——使文件长度为0,读写而打开

a+/a+b/ab+——在文件尾读和写而打开或创建

(3)返回值

        ——FILE结构指针(open返回的是文件描述符)

 

2fflush

——刷新一个流(强制标准I/O库进行系统调用,以将数据传递到内核)

(1)函数原型

int fflush(FILE *fp);

(2)函数参数

        fp:文件指针;若fp=NULL,则刷新所有输出流

(3)返回值

        成功返回0,出错返回EOF

 

3fclose

——关闭一个打开了的流

(1)函数原型

 int fclose(FILE *fp);

(2)函数参数和返回值

          fp:要关闭的流对应的文件指针

(3)返回值

         —成功返回0,出错返回EOF

         在该文件被关闭之前,刷新缓存中的输出数据。缓存中的输入数据被丢弃,如果标准I/O库已经为该流自动分配了一个缓存,则释放此缓存。

 

二、读写文件流

1、字符读/写文件流

1.1fgetc

——读出流中的一个字符

(1)函数原型

int  fgetc(FILE *fp);

(2)函数参数

        fp:文件指针

(3)返回值

        成功返回读到的内容; 出错返回-1。


1.2fputc

——写一个字符到文件流中

(1)函数原型

int  fputc(int c, FILE *fp);

(2)函数参数

        c:字符c

        fp:文件指针

(3)返回值

        成功返回内容; 出错返回-1


2、行读写文件流(一行一行进行)——不能操作二进制文件

2.1fgets

——读出流中的一行字符串

(1)函数原型

char *fgets(char *s, int n, FILE *fp);

(2)函数参数

         s:字符串指针,指向用来存储所得数据的地址

         n:缓冲区大小

        fp:文件指针

(3)返回值

        成功返回读到的内容到s中; 出错返回NULL。


2.2fputs

——写一行字符串到标准流中

(1)函数原型

int *fputs(char*s, FILE *fp);

(2)函数参数

        s:以空字符结尾的字符串(后接换行符)写入标准流stdout中

        fp:文件指针

(3)返回值

        成功返回非负数; 出错返回-1。


3、块读写文件流 (fread/fwrite)

——每次I/O操作读写某种数量的对象,而每个对象具有指定的长度

例如,可读写一个二进制数组、结构

(1)函数原型

size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);

(2)参数

        第一个参数ptr:用于读写的缓冲区

        第二个参数size:每个对象的大小

        第三个参数nobj:要读写的对象个数

        第四个参数fp:文件指针

(3)返回值

        返回实际读/写的对象数


三、文件流定位

1、ftell

——用于获取当前文件偏移量

(1)函数原型

long ftell(FILE *fp);

(2)函数参数

         fp:文件指针

(3)返回值

        成功返回当前文件偏移量; 出错返回-1。

 

2、fseek

——用于设置当前文件偏移量

(1)函数原型:

int fseek(FILE *fp, long offset, int whence);

(2)函数参数

        第一个参数fp:文件指针

        第二个参数offset:相对偏移量:需结合whence才能计算出真正的偏移量

        第三个参数whence:该参数取值是三个常量

SEEK_SET: 当前文件偏移量为:距文件开始处的offset个字节  

SEEK_CUR: 当前文件偏移量为:当前文件偏移量+offset(可正可负)                       

SEEK_END: 当前文件偏移量为:当前文件长度+offset(可正可负)  

(3)返回值

        成功返回0,出错返回非0     

                         

3、rewind                                  

—— 用于将文件偏移量设置到文件的起始位置    

(1)函数原型

void rewind(FILE *fp);

(2)函数参数

        fp:文件指针 

(3)返回值

// 小程序:用标准库函数实现文件拷贝功能:
#include<stdio.h>
//#include<string.h>
#include<stdlib.h>void file_copy(char *fd, char *fp);int main(intargc, char **argv)
{file_copy(argv[1], argv[2]);return 0;
}void file_copy(char *fd, char *fp)
{FILE *from_fd, *to_fd;int ret, file_len; //定义文件大小char buffer[1024];//缓冲区if((from_fd = fopen(fd, "rb")) == NULL) //打开目标文件{printf("file openfail!\n");exit(1);}if((to_fd = fopen(fp, "wb")) == NULL) //创建新文件{printf("file openfail!\n");exit(0);}fseek(from_fd, 0L, SEEK_END);file_len = ftell(from_fd);//计算文件大小fseek(from_fd, 0L, SEEK_SET);if((ret = fread(buffer, file_len, 1, from_fd)) == -1) //读取文件到buffer中,返回实际读到的对象个数(不是读取的字节数){printf("file readfail!\n");exit(0);}//printf("!!!!!!!!!!!%d\n",ret);fwrite(buffer, file_len, 1, to_fd); //把buffer里面的内容写到新文件中fclose(from_fd);fclose(to_fd);//关闭文件
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】spring之任务调度

由于现在大部分的系统都是采用了spring&#xff0c;所以所有的例子都结合spring来构建&#xff0c;目前主要的任务调度分为三种&#xff1a; Java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执…

测试内存对齐对运行速度的影响

我们知道内存对齐是为了方便CPU工作&#xff0c;但是对齐和不对齐差异有多大呢&#xff1f;我自己也没有实际测试过&#xff0c;今天就运行个代码测试看看。1、1字节对齐的时候#include "stdio.h"#pragma pack(1) struct test { char x1; short x2; float x3; …

连接池的问题

看到关于连接池的问题&#xff0c;觉得很有用&#xff0c;摘录到自己博客上 NET 连接池救生员 防止可淹没应用程序的池溢出 William Vaughn 大多数 ADO.NET 数据提供程序使用连接池&#xff0c;以提高围绕 Microsoft 断开连接的 .NET 结构构建的应用程序的性能。应用程序首先打…

Datawhale-零基础入门NLP-新闻文本分类Task01

参考&#xff1a; https://www.jianshu.com/p/56061b8f463a 统计自然语言处理 宗成庆&#xff08;第二版&#xff09; 文本自动分类简称文本分类(text categorization),是模式识别与自然语言处理密切结合的研究课题.传统的文本分类是基于文本内容的,研究如何将文本自动划分为…

fprintf/fscanf函数分析

fprintf/fscanf函数分析 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 fprintf/fscanf函数与printf/scanf区别&#xff1a;printf/scanf专门针对标准输入输出流&#xff0c;fprintf/fscanf函数可用于任意流&#xff0c;包括输入输出流。 1、fprintf …

华为海选开发者状元?还送14件豪礼?

华为云全年最大 最大 最大开发者庆典活动来啦&#xff01;这次庆典没别的&#xff0c;就是&#xff1a;好玩&#xff01;刺激&#xff01;让你拿奖拿到怀疑人生&#xff01;贺岁就要有贺岁的样子~赶紧来看看华为云为开发者们准备了怎样的新年惊喜好玩的在这里&#xff01;上学的…

国际:如何识别真正的程序员

如何识别优秀的程序员&#xff1f;并不是像听起来那么容易。在这儿工作经验的作用是很有限的&#xff0c;因为伟大的程序员不一定要‘正式’的工作经历来证明他们的伟大。 1&#xff0c;激情。 我曾经遇到许多“职业程序员”&#xff0c;他们从事IT是因为觉得这是一种职业&…

Datawhale-零基础入门NLP-新闻文本分类Task02

Task01里边对赛题进行了分析,接下来进行数据读取与数据分析&#xff0c;通过使用Pandas库完成数据读取和分析操作。 1 数据读取 由赛题数据格式可知&#xff0c;可通过read_csv读取train_set.csv数据&#xff1a; import pandas as pd import numpy as np import matplotlib…

一步步分析-C语言如何面向对象编程

这是道哥的第009篇原创一、前言在嵌入式开发中&#xff0c;C/C语言是使用最普及的&#xff0c;在C11版本之前&#xff0c;它们的语法是比较相似的&#xff0c;只不过C提供了面向对象的编程方式。虽然C语言是从C语言发展而来的&#xff0c;但是今天的C已经不是当年的C语言的扩展…

Linux C高级编程——目录操作

Linux C目录操作 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 Linux思想“一切皆文件”&#xff0c;目录也是文件&#xff0c;只是存储的内容有别于普通文件。目录文件中存储的该目录下所有的文件及子目录文件的信息&#xff0c;inode节点。 一、打开…

利用open***建立桥接***[zt]

利用open***建立桥接***http://blog.chinaunix.net/u/7667/showart_30753.html本文介绍利用open***建立桥接***的一种简单方法&#xff0c;使用的服务器为debian GNU/Linux sarge,使用apt-get dist-upgrade更新到最新&#xff0c;内核2.4.27-1-686&#xff0c;未重新编译内核&a…

c复习过程随笔四

使用scanf函数输入数据&#xff1a;一般形式&#xff08;格式控制&#xff0c;地址表列&#xff09; 格式控制中可以包含普通字符 格式控制和printf函数所遵循的格式相似 使用scanf应注意的问题&#xff1a; &#xff08;1&#xff09;格式控制后面应该是变量地址&#xff0c;而…

Datawhale-零基础入门NLP-新闻文本分类Task03

文本是不定长度的&#xff0c;文本表示成计算的能够运算的数字或向量的方法称为词嵌入&#xff08;Word Embedding&#xff09;。词嵌入是将不定长的文本转换成定长的空间中。为了解决将原始文本转成固定长度的特征向量问题&#xff0c;scikit-learn提供了以下方法&#xff1a;…

Linus 在圣诞节想提前放假做了这些解释,哈哈哈

最近在 lkml.org 上看到Linus发布的一个信息&#xff0c;挺有意思的&#xff0c;我看了内容&#xff0c;然后根据自己的理解展示给大家看看&#xff0c;如果有不对的地方欢迎指正。好的&#xff0c;5.10内核发布了我真希望在圣诞节来的最后一个星期没有那么多破事&#xff0c;现…

文件流、目录流、文件描述符总结

文件流、目录流、文件描述符总结 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 内核为使当前进程与进程打开的文件建立联系&#xff0c;在进程PCB&#xff08;一个结构体task_struct&#xff09;中使用一个成员来指向关于打开文件列表的结构体struct …

eleemnt-ui修改主题颜色

饿了吗的element-ui使用的是淡蓝色的主题&#xff0c;有时候我们可以自定义主题&#xff0c;官方的文档给我们提供了如何修改主题&#xff0c;介绍的很详细&#xff0c;自己试验过后&#xff0c;觉得很不错&#xff0c;一方面怕忘记&#xff0c;一方面写一写。 方法一是在线生成…

Datawhale-零基础入门NLP-新闻文本分类Task04

1 FastText 学习路径 FastText 是 facebook 近期开源的一个词向量计算以及文本分类工具,FastText的学习路径为&#xff1a; 具体原理就不作解析了,详细教程见&#xff1a;https://fasttext.cc/docs/en/support.html 2 FastText 安装 2.1 基于框架的安装 需要从github下载源…

多重 for 循环,如何提高效率?

2258 字 14 图 : 文章字数6 分钟 : 预计阅读网络 : 内容来源BabyCoder : 编辑整理前言我在《华为 C 语言编程规范》中看到了这个&#xff1a;当使用多重循环时&#xff0c;应该将最忙的循环放在最内层。如下图&#xff1a;由上述很简单的伪代码可以看到&#xff0c;推荐使用的方…

【转】Web服务软件工厂

patterns & practices开发中心 摘要 Web服务软件工厂(英文为Web Service Software Factory&#xff0c;也称作服务工厂)是一个集成的工具、模式、源代码和规范性指导的集合。它的设计是为了帮助你迅速、一致地构建符合普遍的体系结构和设计模式的Web服务。 如果你是一名负责…

java gui 连接mysql数据库

package com.wt010.db;import java.sql.*;import javax.swing.JFrame; import javax.swing.JTextArea;public class MySQLUtil extends JFrame {// JDBC 驱动名及数据库 URLstatic final String JDBC_DRIVER "com.mysql.jdbc.Driver"; static final String DB_URL …