文件读写归纳
本文最后更新于:2023年4月1日 下午
文件读写终极归纳
最近写实验报告每次都要实现文件的读写操作(无非就是一个读一个
input.txt
文件,写一个output.txt
文件),感觉对自己的文件操作实在是忍无可忍了,于是归纳为这份文档
C Series
众所周知,有两种方式(好吧,我主要知道这两个🥴)
fscanf
,fprintf
-> Cifstream
,ofstream
-> C++
C
- 首先咱们得打开这个文件对吧:
#include <stdio.h>
FIFE * fr = fopen("./input.txt", "r");
FIFE * fw = fopen("./output.txt", "w+");
需要注意的是我们需要引入的这个头文件stdio.h
- 然后就可以开始读写了:
// 读: 需要注意的是这个函数返回一个是否读到的boolean值
fscanf(fr, "%d", &n);
// 写
fprintf(fw, "%d", n);
- 最后就关闭这个读/写文件
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++
- 首先打开文件:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("./input.txt");
ofstream fout("./output.txt");
同样需要头文件fstream
,网上有很多对fstream类的分析(什么继承ios啥的啊),可以自行谷歌
- 像cin/cout一样读写:
fin >> n;
fout << n << endl;
果然这个看起来就比上面的原生C语言要好看很多,输入输出逻辑是和cin/cout
一样的。
- 关闭文件
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 协议 ,转载请注明出处!