C/C++文件读写

一.c语言实现

常用函数介绍

C语言中文件读写操作主要通过stdio.h中的文件操作函数来实现。常用的文件操作函数有fopen、fclose、fread、fwrite、fseek、ftell等。

1.fopen函数:用于打开一个文件,并返回一个指向该文件的指针。函数原型如下:

FILE *fopen(const char *filename, const char *mode);

其中,filename为要打开的文件名,mode为打开文件的模式,常用的模式有:

  • “r”:只读方式打开文件,文件必须存在。
  • “w”:写入方式打开文件,如果文件存在则清空内容,如果文件不存在则创建新文件。
  • “a”:追加方式打开文件,如果文件不存在则创建新文件。
  • “rb”、“wb”、“ab”:以二进制方式打开文件,用于读写二进制文件。
FILE *fp;
fp = fopen("test.txt", "r");
if (fp == NULL) {printf("文件打开失败\n");
} else {printf("文件打开成功\n");
}

2.fclose函数:用于关闭一个文件。函数原型如下:其中,stream为文件指针

int fclose(FILE *stream);

3.fread函数:从文件中读取数据。函数原型如下:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

其中,ptr为存放读取数据的缓冲区指针,size为每个数据项的大小,count为要读取的数据项个数,stream为文件指针。函数返回实际读取的数据项个数。

int num[5];
fread(num, sizeof(int), 5, fp);

4.fwrite函数:向文件中写入数据。函数原型如下:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

其中,ptr为要写入的数据的指针,size为每个数据项的大小,count为要写入的数据项个数,stream为文件指针。函数返回实际写入的数据项个数。

int num[5] = {1, 2, 3, 4, 5};
fwrite(num, sizeof(int), 5, fp);

5.seek函数:移动文件指针的位置。函数原型如下:

int fseek(FILE *stream, long offset, int origin);

其中,stream为文件指针,offset为偏移量,origin为起始位置。常用的起始位置有:

  • SEEK_SET:从文件开头开始偏移。
  • SEEK_CUR:从当前位置开始偏移。
  • SEEK_END:从文件末尾开始偏移。
fseek(fp, 2*sizeof(int), SEEK_SET);

6.ftell函数:获取文件指针的当前位置。函数原型如下:

long ftell(FILE *stream);

 其中,stream为文件指针。函数返回当前位置相对于文件开头的偏移量。

long pos = ftell(fp);

完整代码如下:

#include <stdio.h>int main() {FILE *fp;char buffer[100];// 打开文件进行写操作fp = fopen("example.txt", "w");if (fp == NULL) {printf("Error opening file");return -1;}// 写入内容到文件中fprintf(fp, "This is an example program for file writing in C");// 关闭文件fclose(fp);// 打开文件进行读操作fp = fopen("example.txt", "r");if (fp == NULL) {printf("Error opening file");return -1;}// 从文件中读取内容并打印到控制台fgets(buffer, 100, fp);printf("File content: %s", buffer);// 关闭文件fclose(fp);return 0;
}

连续读取文件 

#include <stdio.h>int main() {FILE *file;char buffer[100];file = fopen("example.txt", "r"); // 打开文件,以只读方式if (file == NULL) {printf("无法打开文件\n");return 1;}while (fgets(buffer, sizeof(buffer), file) != NULL) { // 逐行读取文件内容printf("%s", buffer); // 输出读取到的内容}fclose(file); // 关闭文件return 0;
}

二.c++实现

常用函数介绍

在C++中,可以使用文件流类(fstream)来实现文件的读写操作。fstream类继承自iostream类,提供了读写文件的功能。具体的实现步骤如下:

1.包含头文件

#include <fstream>

2.创建文件流对象

std::fstream file;

3.打开文件

file.open("filename", std::ios::mode);

这里的"filename"是文件名,可以是相对或绝对路径。std::ios::mode是打开文件的模式,常用的模式有:

  • std::ios::in:以只读方式打开文件。
  • std::ios::out:以只写方式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件内容。
  • std::ios::app:以只写方式打开文件,如果文件不存在则创建文件,如果文件存在则在文件末尾追加内容。
  • std::ios::binary:以二进制方式打开文件,适用于非文本文件。
  • 可以组合使用多个模式,例如 std::ios::in | std::ios::out 表示以读写方式打开文件。

4.检查文件是否成功打开

if (file.is_open()) {// 文件成功打开,可以进行读写操作
} else {// 文件打开失败
}

5.文件的读操作

std::string line;
while (std::getline(file, line)) {// 逐行读取文件内容并进行处理
}

这里使用std::getline函数逐行读取文件内容,每次读取一行存储到line变量中。

6.文件的写操作

file << "content";

示例代码如下:

#include <iostream>
#include <fstream>int main() {std::fstream inputFile;std::fstream outputFile;std::string line;// 打开输入文件inputFile.open("input.txt", std::ios::in);if (!inputFile.is_open()) {std::cout << "Failed to open input file." << std::endl;return 1;}// 打开输出文件outputFile.open("output.txt", std::ios::out);if (!outputFile.is_open()) {std::cout << "Failed to open output file." << std::endl;return 1;}// 逐行读取输入文件内容并写入输出文件while (std::getline(inputFile, line)) {outputFile << line << std::endl;}// 关闭文件inputFile.close();outputFile.close();return 0;
}

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

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

相关文章

[docker] docker-compose-redis.yml

docker-compose-redis.yml version: 3services:redis:image: redis:6.2.7container_name: redisports:- "6379:6379"environment:# 时区上海TZ: Asia/Shanghaivolumes:# 配置文件- /docker/redis/conf:/redis/config# 数据文件- /docker/redis/data/:/redis/data/co…

java递归计算文件夹和文件大小

背景 背景发现电脑c盘占用过高,然而我却不清楚是哪些文件占用了磁盘空间,于是我希望用程序来帮我完成这件事。小插曲:开始的时候,我使用python来做的,结果发现效率实在是太低,最后用java重写了一波。有需要的同学可以拿去修改一些。 代码 import java.io.File; import ja…

监控易监测对象及指标之:全面监控达梦数据库6

随着企业业务的不断发展&#xff0c;数据库作为信息存储和管理的核心&#xff0c;其稳定性和安全性成为了企业运营的关键。达梦数据库6作为国产数据库的代表之一&#xff0c;在各类业务场景中发挥着重要作用。 为了确保达梦数据库6的稳定运行和数据安全&#xff0c;对其进行全面…

QT 音乐播放器【二】 歌词同步+滚动+特效

文章目录 效果图概述代码解析歌词歌词同步歌词特效 总结 效果图 概述 先整体说明一下这个效果的实现&#xff0c;你所看到的歌词都是QGraphicsObject&#xff0c;在QGraphicsView上绘制(paint)出来的。也就是说每一句歌词都是一个图元(item)。 为什么用QGraphicsView框架&…

1121 祖传好运

solution 好运数&#xff1a;去除任意位末尾数位 所得到的数都满足能够被当前数位整除 #include<iostream> #include<string> using namespace std; int main(){int k, flag;string s;cin >> k;while(k--){flag 1;cin >> s;for(int i 1; i < s.…

【Linux】进程(3):运行,阻塞,挂起

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;3&#xff09;&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 &#xff08;A&#xff09; 运行&#xff08;R&#xff09;进程切…

在gitlab上发布npm二进制文件

❝ 允许奇迹发生 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。 前言 还记得之前我们讲过如何在 npm 上发布二进制文件&#xff1f;吗。我们通过npm将我们之前在Rust 赋能前端-开发一款属于你的前端脚手架中生成Rust二进制文…

生物制药企业选择谷歌云的理由有哪些?

AI发展的这一年&#xff0c;科学家也紧随其后&#xff0c;透过AI拓展更多微观层面的生物学奥义&#xff0c;包括蛋白质折叠等。生物制药公司也加大了在药物研发领域的投入&#xff0c;其中一方面就是搭载云平台。那么&#xff0c;生物制药公司选择谷歌云的原因有哪些呢&#xf…

Python | Leetcode Python题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution:def longestConsecutive(self, nums: List[int]) -> int:longest_streak 0num_set set(nums)for num in num_set:if num - 1 not in num_set:current_num numcurrent_streak 1while current_num 1 in num_set:curre…

【杂记-TCP协议三次握手、四次挥手始末详解】

一、三次握手前&#xff1a; 使用TCP协议的原因 TCP协议的目的是为了保证数据能在两端准确、连续的传输。 传输中使用Socket数据结构 TCP协议可使一个设备能同时与多个设备交互信息&#xff0c;它必须要保证不同传输通道之间不会产生串联或相互影响&#xff0c;所以TCP使用Soc…

Flutter基础 -- Dart 语言 -- 进阶使用

目录 1. 泛型 generics 1.1 泛型使用 1.2 泛型函数 1.3 构造函数泛型 1.4 泛型限制 2. 异步 async 2.1 异步回调 then 2.2 异步等待 await 2.3 异步返回值 3. 生成器 generate &#xff08;了解&#xff09; 3.1 同步生成器 sync* 使用 sync* 的场景 总结 3.2 异…

【C语言】编译与链接:深入理解程序构建过程

&#x1f525;引言 本篇将深入理解程序构建过程&#xff0c;以便于我们在编写程序的过程同时&#xff0c;理解底层是如何从程序的创建到生成可执行程序的。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专…

MongoDB全文检索: 助力快速精准的文本搜索

MongoDB 全文检索是一种强大的功能&#xff0c;允许用户在文档中进行高效的文本搜索。它提供了对文本数据的复杂查询和索引支持&#xff0c;使得在大规模数据库中进行搜索变得更加快速和精确。本文将详细介绍 MongoDB 全文检索的基本语法、命令、示例、应用场景、注意事项&…

软件设计师-知识点

系统总线 系统总线分为三部分&#xff1a; 数据总线地址总线控制总线 主要作用&#xff1a;用于CPU、主存和外设部件之间的连接 DMA控制器/中断控制器(CPU) DMA控制器和中断控制器(CPU)发出的数据地址&#xff1a;主存物理地址 释&#xff1a;和I/O设备相关的数据都是直接读…

【前端面试常见问题】如何实现一个元素的水平垂直居中

目录 1. 使用 Flexbox 代码示例&#xff1a; 2. 使用 Grid 代码示例&#xff1a; 3. 绝对定位与transform 代码示例&#xff1a; 4. 表格布局方法 代码示例&#xff1a; 5. margin: auto 方法 代码示例&#xff1a; 在网页设计中&#xff0c;将元素精准地置于容器的中…

c++与c

命名空间的设置&#xff1a; 避免冲突 命名空间&#xff1a; 如果将变量全部定义在全局可能不安全&#xff0c;都可以进行修改。 如果将变量定义在局部&#xff0c;当出了大括号就不能使用。 所以说在定义一个命名空间的时候 定义函数&#xff0c;变量&#xff0c;命名空间…

软件3班20240603

经典 报错 404 大概率 就是 这图 的 路径 写错i了 package com.yanyu;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jav…

现货白银的交易时间有多连贯?

国际市场上的现货白银优势很多&#xff0c;它除了具备国内同类型品种所不具备的数十倍资金杠杆外&#xff0c;也基本上实现了全天24小时不间断的交易时间&#xff0c;所以投资者可以在全天候连贯的行情中&#xff0c;寻找属于自己的交易获利机会。 但对于内地的投资者来说&…

从 Lerna 到现代化:原生 Workspaces 和 Changesets 的高效协作

1. 背景 最近新接手的一些 monorepo 的库项目&#xff0c;项目是用 lerna 进行管理的&#xff0c;使用过程中有一些不丝滑的地方&#xff0c;包括&#xff1a; lerna 版本过旧&#xff0c;使用 4.0.0&#xff08;现版本 8.1.3&#xff09;&#xff0c;功能差异过大&#xff0…

C#面:解释什么是闭包

在C#中&#xff0c;闭包是指一个函数可以访问并操作其外部作用域中的变量&#xff0c;即使在函数被调用之后&#xff0c;这些变量仍然可以保持其状态。闭包是通过将函数与其相关的引用环境捆绑在一起实现的。 当一个函数内部引用了外部作用域中的变量时&#xff0c;编译器会创…