IO进、线程——深入了解C语言中的标准IO文件操作和目录流

标准IO

1、文件操作

1.1 打开文件——fopen()、freopen()

FILE *fopen(const char *pathname, const char *mode);
功能:打开文件,并且生成一个流
返回值:成功返回值流指针,失败返回NULL参数说明:
pathname:文件名(包含路径)
mode:打开文件的方式(必须指定读写)r:只读方式打开r+:读写w:文件存在则清空,文件不存在则创建。只写w+:文件存在则清空,文件不存在则创建,读写a:文件存在则在末尾进行写入,不存在则创建a+:文件存在则在末尾近些写入,不存在则创建,还可以读注:任何流刚生成时,不会开辟缓冲区,只有在读或者写时才会马上开辟缓冲区
#include <stdio.h>int main() {FILE *file;file = fopen("example.txt", "w"); // 以写入方式打开文件if (file != NULL) {fprintf(file, "Hello, World!\n"); // 向文件中写入内容fclose(file); // 关闭文件流printf("File opened and written successfully.\n");} else {printf("Failed to open the file.\n");}return 0;
}
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
功能:重定向一个流,用pathname打开的文件生成的流来替代stream原本的流
返回值:成功返回流指针,失败返回NULL参数说明:
pathname:文件名(包含路径)
mode:打开文件的方式(必须指定读写)r:只读方式打开r+:读写w:文件存在则清空,文件不存在则创建。只写w+:文件存在则清空,文件不存在则创建,读写a:文件存在则在末尾进行写入,不存在则创建a+:文件存在则在末尾近些写入,不存在则创建,还可以读
stream:要替换的流
#include <stdio.h>int main(int argc, char *argv[])
{ FILE* fp = freopen("xxx", "r+",stdout);if(fp == NULL){return -1;}printf("hello world\n");return 0;
} 

1.2 读写文件——fgetc()、fputc()、fgets()、fputs()、fread()、fwrite()、

①按字节读写——fgetc()、fputc()

int fgetc(FILE *stream);
功能:从流里面读取一个字符
返回值:成功返回实际读到的字符,失败返回-1参数说明:
stream:要读取的流
int fputc(int c, FILE *stream);
功能:往流里面写入一个字符
返回值:成功返回实际写入的字符,失败返回-1参数说明:
c:要写的内容
stream:要写入的流
#include <stdio.h>int main() {FILE *file;int ch;file = fopen("example.txt", "r"); // 以只读方式打开文件if (file != NULL) {while ((ch = fgetc(file)) != EOF) { // 逐字节读取文件内容putchar(ch); // 将读取到的字符打印到控制台}fclose(file); // 关闭文件流} else {printf("Failed to open the file.\n");}return 0;
}

fgtec()和fputc()实现copy功能

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{ FILE *fb,*fd;if(argc != 3){printf("%s <src_file> <dis_file>\n", argv[0]);}fb = fopen(argv[1],"r");if(fb == NULL){perror("open fb:");return -1;}fd = fopen(argv[2],"w+");if(fd == NULL){perror("poen fd:");return -1;}char buf[64];while(fgets(buf,sizeof(buf),fb) != NULL){fputs(buf, fd);}fclose(fb);fclose(fd);return 0;
} 

②按行读写——fgets()、fputs()

char *fgets(char *s, int size, FILE *stream);
功能:目标是读取一行内容
返回值:成功返回字符串首地址,失败返回NULL参数说明:
s:用于存放读取到的字符串的缓冲区
size:预计要读多少个字节
stream:要读的流注:fgets会读size-1个字节,如果在这个范围内读到了换行,那么在后面添加一个'\0'然后结束函数。如果没读到换行,会读取size-1个数据然后添加一个'\0'结束函数
int fputs(const char *s, FILE *stream);
功能:往流里面写入一串数据
返回值:成功返回1,失败返回-1参数说明:
s:要写入的内容所在的缓冲区
stream:要写入的流
#include <stdio.h>int main() {FILE *file;char buffer[100];file = fopen("example.txt", "r"); // 以只读方式打开文件if (file != NULL) {while (fgets(buffer, sizeof(buffer), file) != NULL) { // 逐行读取文件内容printf("%s", buffer); // 将读取到的行打印到控制台}fclose(file); // 关闭文件流} else {printf("Failed to open the file.\n");}return 0;
}
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{ FILE* fp = fopen("xxx","r");if(fp == NULL){perror("fopen:");return -1;}    char buf[64] = {0};memset(buf, '#', sizeof(buf));fgets(buf, 5, fp);for(int i = 0; i < 64; i++){printf("%c", buf[i]);}   printf("\n");return 0;
} 

③按对象读写——fread()、fwrite()、

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从流里面读取nmemb个对象的数据
返回值:成功返回实际读到对象数,失败返回0参数说明:
ptr:要保存内容的缓冲区地址
size:每个对象的字节大小
nmemb:预计要读多少个对象
stream:要读的流
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:往流里面写入nmemb个对象的数据
返回值:成功返回实际写入的对象数,失败返回0参数说明:
ptr:保存要写入的数据的缓冲区
size:每个对象的字节大小
nmemb:预计要写多少个对象
stream:要写的流
#include <stdio.h>struct Student {char name[50];int age;
};int main() {FILE *file;struct Student student;file = fopen("example.dat", "wb"); // 以二进制写入方式打开文件if (file != NULL) {student.age = 20;fwrite(&student, sizeof(struct Student), 1, file); // 将学生结构体写入文件fclose(file); // 关闭文件流printf("Student data written successfully.\n");} else {printf("Failed to open the file.\n");}return 0;
}

1.3 文件定位——fseek()

int fseek(FILE *stream, long offset, int whence);
功能:改变文件内的定位
返回值:成功返回0,失败返回-1参数说明:
stream:要操作的流
offset:偏移量,正数往后偏移,负数往前偏移
whence:基准点SEEK_SET:文件头SEEK_CUR:文件当前定位SEEK_END:文件尾
#include <stdio.h>int main() {FILE *file;char ch;file = fopen("example.txt", "r"); // 以只读方式打开文件if (file != NULL) {fseek(file, 5, SEEK_SET); // 将文件指针定位到文件头后的第5个字节处ch = fgetc(file); // 读取第5个字节printf("Character at position 5: %c\n", ch);fclose(file); // 关闭文件流} else {printf("Failed to open the file.\n");}return 0;
}

2.目录流——opendir()、readdir()

#include <dirent.h>DIR *opendir(const char *name);
功能:打开一个文件夹,生成一个目录流
返回值:成功返回流指针,失败返回NULL参数说明:
name:要打开的文件夹

读文件——readdir()

struct dirent *readdir(DIR *dirp);
功能:读取一个文件,从打开的文件夹里面读
返回值:成功返回结构体指针,失败返回NULL参数说明:
dirp:打开的目录流
#include <stdio.h>
#include <dirent.h>int main() {DIR *dir;struct dirent *entry;dir = opendir("."); // 打开当前文件夹if (dir != NULL) {while ((entry = readdir(dir)) != NULL) { // 逐个读取文件夹中的文件信息printf("%s\n", entry->d_name); // 打印文件名}closedir(dir); // 关闭目录流} else {printf("Failed to open the directory.\n");}return 0;
}

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

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

相关文章

【状态估计】基于UKF、AUKF的电力系统负荷存在突变时的三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SentencePiece android ndk编译

LLaMa等LLM语言模型一般使用SentencePiece tokenizer&#xff0c;在端侧部署需要编译和使用其c版本。 在安卓平台使用NDK编译 CMakeLists.txt需要进行一些修改&#xff1a; src/CMakeLists.txt如下位置加上log依赖&#xff0c;否则提示android log相关符号不存在。 此外&…

RNN架构解析——LSTM模型

目录 LSTMLSTM内部结构图 Bi-LSTM实现 优点和缺点 LSTM LSTM内部结构图 Bi-LSTM 实现 优点和缺点

解决IDEA的git非常缓慢方法

解决IDEA的git非常缓慢方法 xxxx\IDEA2021.1.3\IntelliJ IDEA 2021.1.3\bin

transformer代码注解

其中代码均来自李沐老师的动手学pytorch中。 class PositionWiseFFN(nn.Module):ffn_num_inputs 4ffn_num_hiddens 4ffn_num_outputs 8def __init__(self,ffn_num_inputs,ffn_num_hiddens,ffn_num_outputs):super(PositionWiseFFN,self).__init__()self.dense1 nn.Linear(ffn…

微服务项目,maven无法加载其他服务依赖

微服务项目&#xff0c;导入了工具类工程&#xff0c;但是一直报错&#xff0c;没有该类&#xff0c; 检查maven 这里的Maven的版本与idea版本不匹配可能是导致依赖加载失败的最重要原因 检查maven配置&#xff0c;我这是原来的maven&#xff0c;home 修改之后,就不报错了

Autosar通信实战系列02-CAN报文发送周期测试脚本开发及周期不准优化

本文框架 前言1. CAN发送报文的周期测试脚本开发2. 发送报文周期不准的可能原因及优化策略2.1 发送报文的控制逻辑2.2 送报文周期不准的可能原因及优化策略前言 在本系列笔者将结合工作中对通信实战部分的应用经验进一步介绍常用,包括但不限于通信各模块的开发教程,代码逻辑…

Webpack5 DefinePlugin的作用

在Webpack 5中&#xff0c;DefinePlugin是一个插件&#xff0c;用于创建全局常量&#xff0c;这些常量可以在编译过程中被引用。它的作用是允许开发人员在代码中定义全局变量&#xff0c;这些变量在构建过程中将被替换为其对应的值。 DefinePlugin并不是必须的&#xff0c;但它…

【ArcGIS Pro二次开发】(53):村规制表、制图【福建省】

这篇算是村规入库的一个延续。 村庄规划中有一些图纸是需要严格按照规范制图&#xff0c;或形成一定规范格式的。 这些图纸的制作基本算是机械式的工作&#xff0c;可以用工具来代替人工。 一、要实现的功能 如上图所示&#xff0c;在【村庄规划】组&#xff0c;新增了两个工…

【雕爷学编程】MicroPython动手做(16)——掌控板之图片图像显示3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

vue3+vite——打测试包+正式包+本地预览打包后的文件——基础积累

最近在学习vue3vite的内容&#xff0c;发现vite和webpack类似&#xff0c;下面将区别及使用方法做一下记录&#xff1a; 1.vite添加环境配置文件 ... ├── src ... ├── .env # 通用环境变量配置 ├── .env.development …

文件操作fread()

fread 是 C 语言中用于从文件中读取数据的函数。它可以读取指定数量的数据项到内存中。c size_t fread(void *ptr, size_t size, size_t count, FILE *stream);ptr&#xff1a;指向接收数据的内存块的指针。size&#xff1a;每个数据项的字节数。count&#xff1a;要读取的数据…

Gitee创建分支

在使用Gitee进行代码托管时&#xff0c;分支是一个非常重要的概念。它可以让我们在不同的开发阶段、不同的团队成员之间协作开发&#xff0c;提高团队工作效率。因此&#xff0c;下面将介绍如何在Gitee仓库中建立分支。 一、在Gitee上创建新的分支 在讲解如何在Gitee上创建新…

快问快答JS面向对象面试题

1、说说你对闭包的理解 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染&#xff0c;缺点是闭包会常驻内存&#xff0c;会增大内存使用量&#xff0c;使用不当很容易造成内存泄露。在js中&#xff0c;函数即闭包&#xff0c;只有函数才会产生作用…

机器学习:提取问题答案

模型BERT 任务&#xff1a;提取问题和答案 问题的起始位置和结束位置。 数据集 数据集 DRCDODSQA 先分词&#xff0c;然后tokenize 文章长度是不同的&#xff0c;bert的token的长度有限制&#xff0c;一般是512&#xff0c; self-attention的计算量是 O ( n 2 ) O(n^2) O(n…

opencv+ffmpeg环境(ubuntu)搭建全面详解

一.先讲讲opencv和ffmpeg之间的关系 1.1它们之间的联系 我们知道opencv主要是用来做图像处理的&#xff0c;但也包含视频解码的功能&#xff0c;而在视频解码部分的功能opencv是使用了ffmpeg。所以它们都是可以处理图像和视频的编解码&#xff0c;我个人感觉两个的侧重点不一…

无涯教程-jQuery - Selectable选择函数

选择能力功能可与JqueryUI中的交互一起使用。此功能可在任何DOM元素上启用选择能力功能。用光标绘制一个框以选择项目。按住Ctrl键可进行多个不相邻的选择。 Select able - 语法 $( "#selectable" ).selectable(); Select able - 示例 以下是一个简单的示例&…

目标检测应用场景—数据集【NO.14】行人跌倒测试

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

Android10 Settings系列(三)根据需求动态添加删除一级菜单、二级菜单的设置项

一 、背景 当时遇到定制需求,需要根据实际需要隐藏Settings的菜单项,于是开始了寻找方法 二 、准备工作 在看了一下源码,经过尝试后,确认生效后,就简单说明一下Settings中布局中主要组成元素 Settings中的菜单项是由 PreferenceScreen 和Preference组成的。其中Prefer…

shardingsphere读写分离配置

注&#xff1a; 如果是升级之前的单库单表&#xff0c;要将之前的 数据库接池 druid-spring-boot-starter 注释掉&#xff0c;换成 druid&#xff0c;否则无法连接数据库。 原因&#xff1a; 因为数据连接池的starter&#xff08;比如druid&#xff09;可能会先加载并且其创…