C++/Python文件读写

目录

1.C++

2.Python

3.C#


1.C++

步骤1:包含头文件 #include < fstream >

步骤2:创建流对象,包括:1)ofstream : 写文件 (2)ifstream : 读文件 (3)fsream : 读写文件;ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间。

ifstream  fin;
ofstream fout;

步骤3:打开文件,打开文件 fin.open ("文件路径" ,打开方式),打开方式包括:

  1. ios::in 读文件
  2. ios::out 写文件(直接用的话会丢丢弃已有数据,即隐含为trunc)
  3. ios::binary 二进制方式
  4. ios:app 追加写(要配合out使用,直接写的话会隐含用ios::out
  5. ios::trunc 覆盖写(要配合out使用)
  6. ios::out|ios::binary 二进制写  //可以用“或|”把以上属性连接起来
fin.open("/home/bing/slambook14/slambook/ch2/test1.txt",ios::in);

步骤4:读写数据

 操纵符功能输入/输出
dec格式化为十进制数值数据输入和输出
endl输出一个换行符并刷新此流输出
ends输出一个空字符输出
hex格式化为十六进制数值数据输入和输出
oct格式化为八进制数值数据输入和输出
setprecision(int p)设置浮点数的精度位数输出

注意:setprecision单独使用是控制有效位数的,与fixed合用才是控制小数点后位数的

#include <iomanip> //setprecision需要用到的头文件
using namespace std;

	//第一种写法
cout<<setiosflags(ios::fixed)<<setprecision(2);

	//第二种写法
cout.setf(ios::fixed);
cout<<setprecision(2);

    //第三种写法
float a=12.123456;
cout << setprecision(3) << a; //输出12.1
cout << fixed << setprecision(3) << a;//输出12.123

步骤4-1:向流中写入数据,最后关闭流。打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作。

fout << x << " " << y << endl;
fout.close();

步骤4-2:从流中读取数据。为了保持健壮性,读文件要有验证代码:

if(!fin.is_open())
{
    std::cerr<<"cannot open the file"
}
//或者
if(!fin)
 {
    std::cerr<<"cannot open the file";
}  

成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();

if(fin.eof()) ShowMessage("已经到达文件尾!");

第一种读的方式(按元素直接读):

//申请读空间:
char buf[1024]={0}; 就是临时申请一个 1024大的读空间(又叫buffer),并且初始化为0。
while (fin >> buf)
    {
        cout << buf << endl;//每一次的buf是空格或回车键(即白色字符)分开的元素
    }
文件:
1 2 3
112
geya
读取结果:
1
2
3
112
geya

第二种读的方式(使用getline按行读):

默认读取数据时,它会传递并忽略任何白色字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。

为了解决这个问题,可以使用一个叫做 getline 的 C++ 函数。此函数可读取整行白色字符,只看换行符,即不看,包括前导和嵌入的空格,并将其存储在字符串对象中。

getline()函数是istream类中的一个成员函数,所以在使用它时,使用istream的对象cin来调用它。getline (char* s, streamsize n ),作用是从istream中读取至多n个字符保存在s对应的数组中。即使还没读够n个字符,如果遇到换行符'\n'则读取终止

char buf[1021]={0};
while(fin.getline(buf,sizeof(buf)))
 {
    std::cout<<buf<<std::endl; 
} 
文件:
a b c
112
读取结果:
a b c
112

第三种读的方式(get):

char c;
while ((c = fin.get()) != EOF)
{
   std::cout << c;
} 
文件:
1 2 3
geya
读取结果:
1 2 3
geya

第四种读的方式:

若已知文件里头数据的顺序,则直接定义字符变量存储单个元素,以白色字符为分割

char a,s1,s2,s3,s4,s5;
std::string s6;
fin >> a >> s1 >> s2 >> s3>>s4>>s5>>s6;
std::cout<<a<<" "<<s1<<" "<<s2<<" "<<s3<<" "<<s4<<" "<<s5<<" "<<s6;
文件:
1 2 3
a b c
112
geya
读取结果:
1 2 3 a b c 112

2.Python

一、读写txt文件

1、打开txt文件。函数=open(x.扩展名,mode=模式)

Note=open('x.txt',mode='w')

2、向文件中写入数据

第一种写入方式:write 写入

Note.write('hello word 你好 \n') #\n 换行符

第二种写入方式: writelines 写入行

Note.writelines(['hello\n','world\n','你好\n','CSDN\n','威武\n']) #\n 换行符

writelines()将列表中的字符串写入文件中,但不会自动换行,换行需要添加换行符 writelines()只存放字符串的列表

3、关闭文件

Note.close()

二、读取txt文件

1、打开文件

使 r 模式打开文件

Note=open('x.txt',mode='r')

打开文件的模式,默认是r模式,如果只是读文件,可以不填写mode模式

Note=open('x.txt')

2、读取文件内容

第一种读取方式:read(int)函数,读取⽂件内容。如果指定读取长度,会按照长度去读取

content=Note.read(3)
print(content)

read()默认读取所有数据

content=Note.read()
print(content)

第二种读取方式:readline(int)函数默认读取文件一行数

content=Note.readline(5)
print(content)

第三种读取方式:readlines() 把每一行的数据作为一个元素放在列表中返回,读取所有行的数据

contents=Note.readlines()
print(contents)
Note.close() //关闭文件

Python写入文件时的覆盖和追加:在使用Python进行txt文件的读写时,当打开文件后,首先用read()对文件的内容读取, 然后再用write()写入 这时发现虽然是用“r+”模式打开,按道理是应该覆盖的,但是却出现了追加的情况。 这是因为在使用read后,文档的指针已经指向了文本最后, 而write写入的时候是以指针为起始,因此就产⽣了追加效果。

 

from datetime import date

sensorType = 'ABC123'		#filename
output = []
inputStr = ''
filename = 'C:/GoTools/csvData/' + sensorType + ' ' + str(date.today()) + '.csv'
fileM = open(filename,'a')

output.append(0)
output.append(1)
output.append(2)
output.append(3)

for a in output:
    inputStr += str(a) + ','	

fileM.write(inputStr + '\n')

3.C#

File 类,命名空间:System.IO,程序集:System.IO.FileSystem.dll。
提供用于创建、复制、删除、移动和打开单一文件的静态方法,并协助创建 FileStream 对象。

using System.IO;

string header = "No.,Model,Material,WD,Exposure,FOV,Points,30_zResolution\r\n";
string contents = string.Join(",", txtNo.Text, txtFOV.Text, txtPoints.Text, zResCalc);
/*AppendAllText(String, String)	
打开一个文件,向其中追加指定的字符串,然后关闭该文件。 如果文件不存在,此方法将创建一个文件,将指定的字符串写入文件,然后关闭该文件。
AppendAllText(String, String, Encoding)	
使用指定的编码将指定的字符串追加到文件中,如果文件还不存在则创建该文件。*/
File.AppendAllText(filePath, "\n" + header + contents, Encoding.Unicode);
/*WriteAllText(String, String)	
创建一个新文件,向其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则会将其截断并覆盖。
WriteAllText(String, String, Encoding)	
创建一个新文件,使用指定编码向其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则会将其截断并覆盖。*/
File.WriteAllText(filePath, header + contents, Encoding.Unicode);

//https://learn.microsoft.com/zh-cn/dotnet/api/system.io.file?view=netcore-3.1

参考链接:

https://zhuanlan.zhihu.com/p/352961501

https://cloud.tencent.com/developer/article/2159717

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值