文件读写归纳

本文最后更新于:2023年4月1日 下午

文件读写终极归纳

最近写实验报告每次都要实现文件的读写操作(无非就是一个读一个input.txt文件,写一个output.txt文件),感觉对自己的文件操作实在是忍无可忍了,于是归纳为这份文档

C Series

众所周知,有两种方式(好吧,我主要知道这两个🥴)

  • fscanf, fprintf -> C

  • ifstream, ofstream -> C++

C

  1. 首先咱们得打开这个文件对吧:
#include <stdio.h>
FIFE * fr = fopen("./input.txt", "r");
FIFE * fw = fopen("./output.txt", "w+");

需要注意的是我们需要引入的这个头文件stdio.h

  1. 然后就可以开始读写了:
// 读: 需要注意的是这个函数返回一个是否读到的boolean值
fscanf(fr, "%d", &n);

// 写
fprintf(fw, "%d", n);
  1. 最后就关闭这个读/写文件
fclose(fr);
fclose(fw);

技巧

很多时候我们就需要对一个文件的多行进行读取,我们同样可以使用fscanf得到所有的数据。只要记住一点:fscanf得到的是当前行的数据

于是可以这样:

int k = 0;
for (int i, j, x; fscanf (fr, "%d%d%d", &i, &j, &x) == 3 && ( i ||j ||x); )
{
    SampleMap[k][0] = i;
    SampleMap[k][1] = j;
    SampleMap[k][2] = x;
    k++;
}

这样就可以把三行的数据读到一个3✖️3的数组

同理写入文件也这样满足这样的规律

C++

  1. 首先打开文件:
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("./input.txt");
ofstream fout("./output.txt");

同样需要头文件fstream,网上有很多对fstream类的分析(什么继承ios啥的啊),可以自行谷歌

  1. 像cin/cout一样读写:
fin >> n;
fout << n << endl;

果然这个看起来就比上面的原生C语言要好看很多,输入输出逻辑是和cin/cout一样的。

  1. 关闭文件
fin.close();
fout.close();

技巧

现在我们再来看看之前的多行写入的解法

for(int i=1; i<=m; i++)
	{	
		for(int j=1; j<=n; j++)
			fout << best[i][j] << "\t";
		fout << endl;
	}
	fout << endl;
}

看着清爽多了。

当然还是没有解决我们读入多行,每行有空格的问题

这样呢:

#include < iostream >
#include < fstream >
#include < string >

using namespace std;

// 输出空行
void OutPutAnEmptyLine()
{
	cout << " /n ";
}

// 读取方式: 逐词读取, 词之间用空格区分
// read data from the file, W ord B y W ord
// when used in this manner, we'll get space-delimited bits of text from the file
// but all of the whitespace that separated words (including newlines) was lost.
void ReadDataFromFileWBW()
{
	ifstream fin("data.txt ");
	string s;
	while (fin >> s)
	{
		cout << " Read from file: " << s << endl;
	}
}

// 读取方式: 逐行读取, 将行读入字符数组, 行之间用回车换行区分
// If we were interested in preserving whitespace,
// we could read the file in L ine-B y-L ine using the I/O getline() function.
void ReadDataFromFileLBLIntoCharArray()
{
	ifstream fin("data.txt");
	const int LINE_LENGTH = 100;
	char str[LINE_LENGTH];
	while (fin.getline(str, LINE_LENGTH))
	{
		cout << " Read from file: " << str << endl;
	}
}

// 读取方式: 逐行读取, 将行读入字符串, 行之间用回车换行区分
// If you want to avoid reading into character arrays,
// you can use the C++ string getline() function to read lines into strings
void ReadDataFromFileLBLIntoString()
{
	ifstream fin("data.txt");
	string s;
	while (getline(fin, s))
	{
		cout << " Read from file: " << s << endl;
	}
}

// 带错误检测的读取方式
// Simply evaluating an I/O object in a boolean context will return false
// if any errors have occurred
void ReadDataWithErrChecking()
{
	string filename = "dataFUNNY.txt";
	ifstream fin(filename.c_str());
	if (!fin)
	{
		cout << " Error opening " << filename << " for input " << endl;
		exit(-1);
	}
}

int main()
{
	ReadDataFromFileWBW(); // 逐词读入字符串
	OutPutAnEmptyLine(); // 输出空行

	ReadDataFromFileLBLIntoCharArray(); // 逐词读入字符数组
	OutPutAnEmptyLine(); // 输出空行

	ReadDataFromFileLBLIntoString(); // 逐词读入字符串
	OutPutAnEmptyLine(); // 输出空行

	ReadDataWithErrChecking(); // 带检测的读取
	return 0;
}

Python

Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

主要格式是这样的:

open(file, mode='r')

mode参数主要有:

  • r -> 只读

  • r+ -> 打开一个文件用于读写。文件指针将会放在文件的开头。

  • w -> 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

  • w+ -> 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

  • wb -> 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

with .. as ..搭配

with open('img/' + url, 'wb') as file:
    file.write(content)

这样的好处就是直接写在with下面的作用域里面进行io操作,最后跳出作用域自动就进行file.close()

读入多行

相比于C,python的多行就好多了,直接有readlines()函数

with open(url, 'wb') as file:
    lines = file.readlines()
    for line in lines:
        print(line)

然后切分就可以直接用split()函数进行二级数组的划分

arr = []
with open(url, 'wb') as file:
    lines = file.readlines()
    for line in lines:
        arr.append(line.split(' '))

更多关于python文件操作的函数,可以问问谷歌

Java

  • FileInputStream

使用:

File f = new File("./hello.txt");
InputStream in = new FileInputStream(f);
byte n = f.read();

这个read方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。

  • FileOutputStream

使用:

File f = new File("./output.txt");
OutputStream fOut = new FileOutputStream(f);
f.write(n);

这个write方法把指定的字节写到输出流中。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!