一文搞定文件的读写操作

文件的操作

C

C语言中,文件的读取操作流程如下:

  1. 定义一个文件的指针
  2. 将指针指向需要打开的文件,并且赋予该指针权限(读,写,追加)
  3. 然后开始向文件写/读数据

打开文件

定义文件指针:FILE *fp = NULL;

给文件指针赋值,并赋予权限: fp = fopen(path, "r");,这里的path为文件的路径,r表示赋予的权限,更多的权限如下。

文件的读写权限:

模式字符串解释
r只读方式打开文件,文件必须存在。
w只写方式打开文件,如果文件存在则清空内容,如果文件不存在则创建。
a追加方式打开文件,如果文件不存在则创建
r+读写方式打开文件,文件必须存在。
w+读写方式打开文件,如果文件存在则清空内容,如果文件不存在则创建。
a+读写方式打开文件,如果文件不存在则创建,并总是追加到文件末尾。

读取文件(fgets()):

fgets()的第一个参数表示需要将文件数据写入的地址,可以为一个指针/数组,第二个参数表示需要写入数据的大小,第三个参数表示文件指针。

例子:
char data[255];   // 定义写入数据的地址
printf("文件内容为:\n");
while (fgets(data, sizeof(data), fp) != NULL) {   // 进行循环读取文件,直到读到文件的最后位置printf("%s", data);
}

写入文件(fputs()

写入文件使用fputs(),其参数有两个,第一个参数表示要写入的数据,第二个参数表示要写入的文件。

关闭文件(fclose()):

关闭文件使用fclose(fp)进行关闭,其参数为要关闭的文件指针。

实例

#include<stdio.h>
#include<string.h>// 定义文件指针
FILE *fp = NULL; char buff[255];
// 文件的读取
int readFile(char* path){fp = fopen(path, "r");if(fp == NULL){printf("无法打开文件\n");return 0;}char data[255];printf("文件内容为:\n");while (fgets(data, sizeof(data), fp) != NULL) {printf("%s", data);}fclose(fp);printf("文件读取完毕\n");return 1;
}// 文件的写入
int writeFile(char *path){fp = fopen(path, "w");if(fp == NULL){printf("无法打开文件! \n");return 0;}char data[255];gets(data);   // 从键盘中录入数据fputs(data, fp);printf("文件内容已经写入! \n"); return 1;
}// 文件的追加
int addFile(char* path){fp = fopen(path, "a");if(fp == NULL){printf("文件打开失败!\n");return 0;}char data[255];gets(data);   // 从键盘中读取文件输入到data中fputs(data, fp);fclose(fp);printf("已成功追加内容到文件! \n");return 1;
} int main(){char* path = "../tmp.txt";readFile("../tmp.txt");
//	writeFile("../new.txt");
//	addFile(path);return 0;
} 

C++

C++使用流的形式对文件进行读写操作。

C++文件的读取操作流程如下:

  1. 创建流对象。
  2. 打开文件进行读、写、追加操作。
  3. 关闭文件流。

创建流对象,一共有三种流方式:

流对象解释
ofstream写文件
ifstream写文件
fstream读写文件

打开文件,使用open方法进行打开文件, 其语法格式为:file.open ("文件路径" ,打开模式),其中file是一个流对象。

六种模式:

常量解释
ios::app每次写入前寻位到流结尾
ios::binary以二进制模式打开
ios::in只读模式打开
ios::out只写模式打开
ios::trunc在打开后舍弃流的内容
ios::ate打开后立即寻位到流结尾

文件的读写操作:

最简单的方式是直接使用file<<...;file>>...;两个方法进行输入输出流操作。

关闭流:

使用file.close();可以直接关闭流,其中file表示一个流对象。

实例

// c++的读写操作
#include<iostream>
#include<string>
#include<fstream>
using namespace std;// 文件的读取操作
int readFile(string path){ifstream f;  //	也可使用:fstream f;string data;f.open(path);if(!f.is_open()){cout<<"无法打开文件!"<<endl;return 0;}cout<<"读取文件的内容为:"<<endl;while(getline(f, data)){cout<<data;}f.close();cout<<"文件读取完毕!"<<endl; return 1;
}// 文件的写入操作
int writeFile(string path){ofstream f;  //	也可使用:fstream f;string st = "这是一个测试字符串\n"; f.open(path, ios::out);if(!f.is_open()){cout<<"无法打开文件!"<<endl;return 0;}f<<"张三: 男"<<endl;f<<"李四: 男"<<endl;f<<st;cout<<"文件写入完毕!"<<endl; f.close();return 1;
}// 文件的追加操作
int addFile(string path){ofstream f;  //	也可使用:fstream f;f.open(path, ios::app);if(!f.is_open()){cout<<"无法打开文件!"<<endl;return 0;}f<<"王五:男"<<endl;f<<"赵六:男"<<endl;char *st = "王红:女\n";f<<st;cout<<"文件追加完毕!"<<endl;f.close();return 1;
}int main(){string path = "../tmp.txt";readFile(path);
//	writeFile("../new.txt");
//	addFile("../new.txt");return 0;
} /*
打开方式:
ios::in    只读 
ios::out   只写 
ios::ate   指针指向文件末尾 
ios::app   追加 
ios::trunc  如果原文件存在先删除在创建 
ios::binary   二进制方式打开文件 
*//*
文件操作的三大类型:
ofstream  :写操作 
ifstream  :读操作 
fstream   :读写操作 
*/

Java

Java文件的读写操作有两种方式,分别是字节流字符流,其最大区别在于:字节流无法读取中文,包括中文符号,而字符流可以读取中文包括中文符号。

字节流

整体流程:

  1. new一个文件对象。
  2. 使用流的方式打开文件对象。
  3. 进行读或写文件。
  4. 关闭文件
打开文件

new一个文件对象:File f = new File(path);

使用流的方式打开文件对象,有两种方式:

  1. 输入流:FileInputStream
  2. 输出流:FileOutputStream
读取(写入)文件

读取文件操作finp.read()

写入文件操作:要先将写入的数据转换为二进制流形式。

byte[] buff = this.data.getBytes();fout.write(buff);
关闭文件

直接使用close()方法关闭文件即可,如:fout.close();

字符流

整体流程:

  1. 初始化文件
    1. new一个文件对象
    2. 读取文件对象
    3. 使用字符流读取文件对象
  2. 进行读或写文件
  3. 关闭文件
初始化文件:
  1. 初始化读取文件:
File f = new File(this.path);
FileReader fr = null;   // 文件读取对象
BufferedReader fbr = null;   // 字符流读取对象fr = new FileReader(f);
fbr = new BufferedReader(fr);
  1. 初始化写入文件:
File f = new File(path);
FileWriter fw = null;
BufferedWriter fwb = null;fw = new FileWriter(f);
fwb = new BufferedWriter(fw);
进行读或写文件:
  1. 进行读取操作
str = fbr.readLine()   // 如果执行到文件末尾,则返回null
  1. 进行写入操作
fwb.write(cdata[i]);
fwb.newLine();  // 换行操作
关闭文件

注意关闭的顺序!!!

fbr.close();  // 先关闭流对象
fr.close();   // 再关闭文件读取对象

序列化与反序列化

序列化

序列化可以将java对象进行存储。

// 序列化:用于存储java对象
public int seqToFile(String path) {Set<String> set = new HashSet<>();set.add("one");set.add("tow");set.add("three");File f = new File(path);FileOutputStream fo = null;ObjectOutputStream fob = null;try {fo = new FileOutputStream(f);fob = new ObjectOutputStream(fo);   // 进行序列化fob.writeObject(set);  // 写入Java对象System.out.println("序列化文件写入完毕!");} catch (Exception e){e.printStackTrace();}finally {try {fob.close();fo.close();} catch (Exception e){e.printStackTrace();}}return 0;
}
反序列化

反序列化可以从文件中读取java对象。

// 进行反序列化
public int FileToseq(String path){Set<String> set = null;File f = new File(path);FileInputStream fi = null;ObjectInput fio = null;try {fi = new FileInputStream(f);fio = new ObjectInputStream(fi);Object obj = fio.readObject();   // Object类型可以接收所有java对象set = (HashSet<String>) obj;System.out.println("反序列化读写完毕!");} catch (Exception e){e.printStackTrace();}finally {try {fio.close();fi.close();} catch (Exception e){e.printStackTrace();}}// 进行输出set集合for(String i :set){System.out.println(i);}return 0;
}

实例

import javax.swing.*;
import java.io.*;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;class WRClass {public String path;  // 原文件的路径public String new_path;  // 新建文件的路径public String data = "This is a new txt.\n";public WRClass(String path, String new_path) {this.path = path;this.new_path = new_path;}// 创建文件public int CreateFile(String path) {File f = new File(path);if (f.exists()) {System.out.println("文件已存在!");return 1;} else {try {f.createNewFile();System.out.println("文件创建成功");} catch (Exception e) {}}return 0;}// Stream流(字节流)  无法读取中文,包括中文符号// 文件的读操作public int ReadFile() {try {File f = new File(this.path);FileInputStream finp = new FileInputStream(f);for (int i = 0; i < f.length(); i++) {// 循环读取文件char ch = (char) (finp.read());System.out.println(ch + ' ');}System.out.println("\n");finp.close();   // 进行关闭流} catch (Exception e) {System.out.println("文件打开失败!");}return 0;}// 文件的写操作public int WriteFile(String path) {File f = new File(path);try {FileOutputStream fout = new FileOutputStream(f);// 将字符转换为字节byte[] buff = this.data.getBytes();fout.write(buff);  // 写入文件try {fout.close();} catch (Exception e) {e.printStackTrace();}} catch (Exception e) {System.out.println("文件打开失败!");}return 0;}// Stream流(字符流) 可以读取中文字符// 文件的读取操作public int CReadFIle() {File f = new File(this.path);FileReader fr = null;   // 文件读取对象BufferedReader fbr = null;   // 字符流读取对象try {fr = new FileReader(f);fbr = new BufferedReader(fr);// 循环打印文件的每一行数据String str = null;while ((str = fbr.readLine()) != null) {System.out.println(str);}System.out.println("文件读取完毕!");} catch (Exception e) {e.printStackTrace();} finally {try {fbr.close();fr.close();} catch (Exception e) {e.printStackTrace();}}return 0;}// 文件的写操作public int CWriteFile(String path) {String[] cdata = {"这是第一行数据", "这是第二行数据"};File f = new File(path);FileWriter fw = null;BufferedWriter fwb = null;try {fw = new FileWriter(f);fwb = new BufferedWriter(fw);for (int i = 0; i < cdata.length; i++) {fwb.write(cdata[i]);fwb.newLine();  // 换行操作}System.out.println("文件写入完毕!");} catch (Exception e) {} finally {try {fwb.close();fw.close();} catch (Exception e) {e.printStackTrace();}}return 0;}// 序列化:用于存储java对象public int seqToFile(String path) {Set<String> set = new HashSet<>();set.add("one");set.add("tow");set.add("three");File f = new File(path);FileOutputStream fo = null;ObjectOutputStream fob = null;try {fo = new FileOutputStream(f);fob = new ObjectOutputStream(fo);   // 进行序列化fob.writeObject(set);  // 写入Java对象System.out.println("序列化文件写入完毕!");} catch (Exception e){e.printStackTrace();}finally {try {fob.close();fo.close();} catch (Exception e){e.printStackTrace();}}return 0;}// 进行反序列化public int FileToseq(String path){Set<String> set = null;File f = new File(path);FileInputStream fi = null;ObjectInput fio = null;try {fi = new FileInputStream(f);fio = new ObjectInputStream(fi);Object obj = fio.readObject();   // Object类型可以接收所有java对象set = (HashSet<String>) obj;System.out.println("反序列化读写完毕!");} catch (Exception e){e.printStackTrace();}finally {try {fio.close();fi.close();} catch (Exception e){e.printStackTrace();}}// 进行输出set集合for(String i :set){System.out.println(i);}return 0;}
}public class Java {public static void main(String[] args) {String path = "../tmp.txt";String new_path = "../new.txt";String java_new_path = "../jnew.txt";WRClass wr = new WRClass(path, new_path);
//        wr.CreateFile(java_new_path);
//        wr.CReadFIle();
//        wr.WriteFile(java_new_path);
//        wr.CReadFIle();
//        wr.CWriteFile(java_new_path);
//        wr.seqToFile(java_new_path);wr.FileToseq(java_new_path);}
}

Python

Python文件的读写操作非常简便,其流程如下

  1. 直接将一个对象赋值为一个打开的文件,打开文件使用open(path, model)方法。
  2. 进行文件的读或写操作。
  3. 关闭文件。

打开文件

打开文件使用open(path, model)方法,第一个参数为文件的路径,第二个参数为文件的读写权限,具体的权限如下:

文件的读写权限:

模式字符串解释
w只写
r只读
a追加
b二进制文件

文件的读写权限可以任意组合

文件的读写操作:

方法解释
f.readline()按行读取文件中的内容,遇到换行符自动结束读取,进入等待状态(等待下次的读取)
f.seek(0)定位指针
f.readlines()读取所有行,并将每一行作为一个元素存放到列表中。
f.writelines(self.data)向文件写入所有行
f.write(self.st)向文件写入所有文件
f.read()读取所有数据

关闭文件

直接调用close()方法。

对于文件的读写操作可以使用with语句进行操作,这样做的好处是不用在关闭文件的流了,可以防止由于疏忽造成的文件误关闭的意外。

实例

''''
文件的读取操作
w : 只写
r : 只读
a : 追加
b : 二进制文件
'''class WRFile(object):def __init__(self, path, new_path):self.path = pathself.new_path = new_pathself.data = ['line 1\n', 'line 2\n', 'line3\n']self.st = "This is a new txt.\n"def readFile(self, flag: int = 1):'''读取文件:return:'''if flag == 1:# 读取整个文件with open(self.path, 'r') as f:content = f.read()# content = f.read(10) #  读取前10个字符# f.seek(0)  # 将文件指针重新移动到开头print(content)elif flag == 2:# 按行读取文件with open(self.path, 'r') as f:line = "test"while line:line = f.readline()print(line)elif flag == 3:# 读取所有行with open(self.path, 'r') as f:lines = f.readlines()  # 读取到一个列表中for line in lines:print(line)def writeFile(self, flag: int = 1):'''写入文件:return:'''if flag == 1:# 写入多行文件with open(self.new_path, 'w') as f:f.writelines(self.data)elif flag == 2:# 写入字符串with open(self.new_path, 'w') as f:f.write(self.st)def addFile(self, flag: int = 1):if flag == 1:with open(self.new_path, 'a') as f:f.write(self.st)if flag == 2:f = open(self.new_path, 'a')f.write(self.st)f.close()def __del__(self):   # 当类对象被销毁时直接调用该方法。print("程序执行完毕!!!")if __name__ == '__main__':File = WRFile(path="../tmp.txt", new_path="../new.txt")File.readFile(flag=2)# File.writeFile(flag=2)# File.addFile(flag=2)

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

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

相关文章

Android面试必考题1-15

目录 Service 和 主进程区别 一、性能优化 2.什么情况下会导致内存泄露 3.如何避免 OOM 异常

链式队列基本操作

链式队列的基本概念 链式队列是一种常见的数据结构&#xff0c;它使用链表作为其底层数据存储结构。链式队列的特点是动态的内存分配&#xff0c;可以有效地处理队列的入队和出队操作。下面&#xff0c;我将介绍链式队列的实现方法&#xff0c;并提供相应的C语言代码示例。 链…

C语言-设置控制台信息

Win_API Win_API是Windows应用程序接口&#xff08;Windows Application Programming Interface&#xff09;的缩写&#xff0c;它是一组函数、系统服务和程序接口&#xff0c;允许开发者在微软Windows操作系统上创建应用程序。Win32 API 是Windows API的一个主要部分&#xff…

Linux PXE高效批量网络装机

系统初始化 systemctl disable --now firewalld.service setenforce 0 vim /etc/selinux/config 安装软件 yum install -y tftp-server xinetd dhcp vsftpd syslinux 复制 vmlinuz initrd.img pxelinux.0 到 /var/lib/tftpboot/ 目录 [rootlocalhost ~]# cd /mnt/…

设计模式之业务代表模式

在编程江湖的风雨中漂泊多年&#xff0c;每当我遇到那些错综复杂的业务逻辑和系统交互&#xff0c;总有一个模式像一位忠诚的骑士&#xff0c;默默守护着我的代码城堡&#xff0c;那就是——业务代表模式&#xff08;Business Delegate Pattern&#xff09;。它不是最耀眼的明星…

C++ 如何进阶?

一、C基础&#xff08;3个月&#xff09; 1、面向对象的三大特性&#xff1a;封装、继承、多态 2、类的访问权限&#xff1a;private、protected、public 3、类的构造函数、析构函数、赋值函数、拷贝函数 4、移动构造函数与接贝构造函数对比 5、深接贝与浅贝的区别 6、空…

【C++语言】类和对象--默认成员函数 (中)

文章目录 前言类的六个默认成员函数&#xff1a;1. 构造函数概念特性做了什么&#xff1f;易错注意&#xff1a;显式定义和默认构造函数 2. 析构函数概念特征做了什么?注意事项&#xff1a; 3.拷贝构造函数概念特征做了什么&#xff1f;注意事项&#xff1a; 4.赋值运算符重载…

MySQL基础_4.排序与分页

文章目录 一、排序二、分页 一、排序 使用 ORDER BY 子句排序&#xff1a; ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序 二、分页 MySQL中使用 LIMIT 实现分页&#xff0c;格式&#xff1a; LIMIT [位置偏移量,] 行数第一个“位置偏…

Linux程序库文件调试测试方法

Linux编译后的.so文件是需要进行上机测试的&#xff0c;对于已经量产的硬件平台来说一般是通过具有相同功能的样机测试新版本的功能&#xff0c;具体如下。 Linux的量产固件由于已经经过裁剪系统内部的usr lib etc等目录是只读的权限不可以修改因此不能将测试库直接放到其下进行…

JavaScript异步编程——01-单线程和异步任务

单线程 JS 是单线程的 JavaScript 语言的执行是单线程的。即同一时间&#xff0c;只能处理一个任务。 具体来说&#xff0c;所谓单线程&#xff0c;是指 JS 引擎中负责解释和执行 JavaScript 代码的线程只有一个&#xff0c;即同一时间&#xff0c;只能处理一个任务。这个任…

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…

ComfyUI 基础教程(十三):ComfyUI-Impact-Pack 面部修复

SD的WebUI 中的面部修复神器 ADetailer,无法在ComfyUI 中使用。那么如何在ComfyUI中进行面部处理呢?ComfyUI 中也有几个面部修复功能,比如ComfyUI Impact Pack(FaceDetailer),以及换脸插件Reactor和IPAdapter。 ComfyUI-Impact-Pack 是一个功能强大的插件,专为 ComfyUI …

GDB的常用命令

GDB&#xff08;GNU Debugger&#xff09;是Linux和其他类Unix系统中常用的调试工具&#xff0c;用于调试C、C等编程语言编写的程序。以下是一些GDB常用的命令&#xff1a; 启动和基本操作 gdb [executable-file]&#xff1a;启动GDB并加载指定的可执行文件。 run [arguments]…

淘宝扭蛋机小程序开发:开启你的惊喜之旅

一、扭出新世界&#xff0c;惊喜不断 在这个充满无限可能的数字时代&#xff0c;淘宝扭蛋机小程序为你带来了一种全新的购物与娱乐体验。扭蛋机&#xff0c;这个充满童趣和惊喜的玩具&#xff0c;如今在我们的小程序中焕发出新的活力&#xff0c;为你带来一波又一波的惊喜与快…

【CTF Web】XCTF GFSJ0485 simple_php Writeup(代码审计+GET请求+PHP弱类型漏洞)

simple_php 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 解法 &#xfeff;<?php show_source(__FILE__); include("config.php"); $a$_GET[a]; $b$_GET[b]; if($a0 and $a){echo $flag1; } if(is_numeric($b)){exit(); } if($b>1234){ech…

jquery项目 html使用export import方式调用模块

jquery的老项目&#xff0c;引入vue3, 需要方便使用export, import方式引用一些常用的方法与常量 导出模块 export js/numberUtil.js /*** Description:* Author Lani* date 2024/1/10*//* * 【金额】 保留2位小数&#xff0c;不四舍五入 * 5.992550 >5.99 , 2 > 2.…

【Kaggle】练习赛《洪水数据集的回归预测》(下)

前言 上篇《洪水数据集的回归预测》(上) 介绍了该数据集非常特殊之处&#xff0c;各特征都非常类似&#xff0c;没有特别之处&#xff0c;各特征之间的相关系数几乎为零。同时&#xff0c;各类模型不敏感&#xff0c;最理想的模型居然是线性回归&#xff0c;决定系数 R 2 R^2 …

64位Office API声明语句第118讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

Python进阶:函数

Python进阶 函数的定义和调用 函数定义通常采用def关键词,后面跟着函数名及圆括号内的参数列表。 def function_name (parameters):"""函数文档字符串"""# 函数体...return expression # 可选&#xff0c;用于返回函数结果function_name是函数…

富格林:曝光欺诈陷阱阻挠受骗亏损

富格林悉知&#xff0c;今年以来&#xff0c;国际金融市场动荡&#xff0c;黄金价格则表现强势&#xff0c;黄金投资热潮再起&#xff0c;黄金作为避险工具的价值再度成为世人瞩目的焦点。然而做好黄金投资却不是那么容易的&#xff0c;没有掌握一定的做单技巧&#xff0c;便难…