C++中Txt⽂件读取和写⼊(⽅法汇总)
⼀、ASCII⽂件 输出
  为了使⽤下⾯的⽅法, 你必须包含头⽂件 <fstream.h>(在标准C++中,已经使⽤取代< fstream.h>,所有的C++标准头⽂件都是⽆后缀的。)这是 <iostream.h>的⼀个扩展集, 提供有缓冲的⽂件输⼊输出操作. 事实上, <iostream.h> 已经被<fstream.h>包含了。我们从⽂件操作类的设计开始, 我会讲解如何进⾏ASCII I/O操作。 这篇⽂章介绍的⽅法,我们分别使⽤”ifstream”和 “ofstream” 来作输⼊输出。如果你⽤过标准控制台流”cin” 和 “cout,” 那现在的事情对你来说很简单。 我们现在开始讲输出部分,⾸先声明⼀个类对象。 ofstream fout; 这就可以了,不过你要打开⼀个⽂件的话, 必须像这样调⽤ ofstream::open()。
fout.open(“”); 你也可以把⽂件名作为构造参数来打开⼀个⽂件.
ofstream fout(“”); 这是我们使⽤的⽅法, 因为这样创建和打开⼀个⽂件看起来更简单. 顺便说⼀句, 如果你要打开的⽂件不存在,它会为你创建⼀个, 所以不⽤担⼼⽂件创建的问题. 现在就输出到⽂件,看起来和”cout”的操作很像。对不了解控制台输
出”cout”的⼈, 这⾥有个例⼦。
int num = 150;
char name[] = "John Doe";
cout << "Here is a number: " << num << "/n";
cout << "Now here is a string: " << name << "/n";
保存⽂件,你必须关闭⽂件,或者回写⽂件缓冲.
1.⽂件关闭之后就不能再操作了, 所以只有在你不再操作这个⽂件的时候才调⽤它,它会⾃动保存⽂件。
2.回写缓冲区会在保持⽂件打开的情况下保存⽂件, 所以只要有必要就使⽤它。 回写看起来像另⼀次输出, 然后调⽤⽅法关闭。像这样:
fout << flush; fout.close(); 现在你⽤⽂本编辑器打开⽂件,内容看起来是这样:
Here is a number: 150 Now here is a string: John Doe 很简单吧! 现在继续⽂件输⼊, 需要⼀点技巧, 所以先确认你已经明⽩了流操作,对 “<<” 和”>>” ⽐较熟悉了, 因为你接下来还要⽤到他们。
⼆、ASCII ⽂件输⼊
输⼊和”cin” 流很像. 和刚刚讨论的输出流很像, 但你要考虑⼏件事情。在我们开始复杂的内容之前, 先看⼀个⽂本:
12 GameDev 15.45 L This is really awesome! 为了打开这个⽂件,你必须创建⼀个in-stream对象
ifstream fin(“”); 现在读⼊前四⾏. 你还记得怎么⽤”<<” 操作符往流⾥插⼊变量和符号吧?好,在 “<<” (插⼊)操作符之后,是”>>” (提取) 操作符. 使⽤⽅法是⼀样的. 看这个代码⽚段.
int number;
float real;
char letter, word[8];
fin >> number; fin >> word; fin >> real; fin >> letter; 也可以把这四⾏读取⽂件的代码写为更简单的⼀⾏。
fin >> number >> word >> real >> letter; 它是如何运作的呢? ⽂件的每个空⽩之后, “>>” 操作符会停⽌读取内容, 直到遇到另⼀个>>操作符. 因为我们读取的每⼀⾏都被换⾏符分割开(是空⽩字符), “>>” 操作符只把这⼀⾏的内容读⼊变量。这就是这个代码也能正常⼯作的原因。但是,可别忘了⽂件的最后⼀⾏。
This is really awesome! 如果你想把整⾏ 读⼊⼀个char数组, 我们没办法⽤”>>”操作符,因为每个单词之间的空格(空⽩字符)会中⽌⽂件的读取。但是有读取整⾏的⽅法, 它就是 getline()这就是我们要做的。
读⽂件相关函数
⽅法get() 每次返回⼀个字符。
⽅法ignore(int,char) 跳过⼀定数量的某个字符, 但你必须传给它两个参数。第⼀个是需要跳过的字符数。 第⼆个是⼀个字符, 当遇到的时候就会停⽌。 例⼦,
fin.ignore(100, ‘/n’); 会跳过100个字符,或者不⾜100的时候,跳过所有之前的字符,包括 ‘/n’。
⽅法peek() 返回⽂件中的下⼀个字符, 但并不实际读取它。所以如果你⽤peek() 查看下⼀个字符, ⽤get() 在peek()之后读取,会得到同⼀个字符, 然后移动⽂件计数器。
⽅法putback(char) 输⼊字符, ⼀次⼀个, 到流中。我没有见到过它的使⽤,但这个函数确实存在。
如果是个很⼤的多⾏存储的⽂本型⽂件可以这么读:
char buf[1024];                //临时保存读取出来的⽂件内容
string message;
ifstream infile;
infile.open("myfile.js");
if(infile.is_open())          //⽂件打开成功,说明曾经写⼊过东西
{
d() && !f())
{
memset(buf,0,1024);
message = buf;
......                    //这⾥可能对message做⼀些操作
cout<<message<<endl;
}
infile.close();
}
你应该已经知道如何读取和写⼊ASCII⽂件了。但我们还不能罢休,因为⼆进制⽂件还在等着我们。
三、⼆进制 输⼊输出
⼆进制⽂件会复杂⼀点, 但还是很简单的。 ⾸先你要注意我们不再使⽤插⼊和提取操作符(译者注:<< 和 >> 操作符). 你可以这么做,但它不会⽤⼆进制⽅式读写。你必须使⽤read() 和write() ⽅法读取和写⼊⼆进制⽂件. 创建⼀个⼆进制⽂件, 看下⼀⾏。
ofstream fout(“file.dat”, ios::binary); 这会以⼆进制⽅式打开⽂件, ⽽不是默认的ASCII模式。⾸先从写
⼊⽂件开始。函数write() 有两个参数。 第⼀个是指向对象的char类型的指针, 第⼆个是对象的⼤⼩(译者注:字节数)。 为了说明,看例⼦。
int number = 30; fout.write((char *)(&number), sizeof(number)); 第⼀个参数写做”(char )(&number)”. 这是把⼀个整型变量转为char 指针。如果你不理解,可以⽴刻翻阅C++的书籍,如果有必要的话。第⼆个参数写作”sizeof(number)”. sizeof() 返回对象⼤⼩的字节数. 就是
这样!
⼆进制⽂件最好的地⽅是可以在⼀⾏把⼀个结构写⼊⽂件。 如果说,你的结构有12个不同的成员。 ⽤ASCII?⽂件,你不得不每次⼀条的写⼊所有成员。 但⼆进制⽂件替你做好了。 看这个。
struct OBJECT { int number; char letter; } obj;
obj.number = 15;
obj.letter = ‘M’;
fout.write((char *)(&obj), sizeof(obj));
这样就写⼊了整个结构! 接下来是输⼊. 输⼊也很简单,因为read()?函数的参数和 write()是完全⼀样的, 使⽤⽅法也相同。
ifstream fin("file.dat", ios::binary); ad((char *)(&obj), sizeof(obj)); 我不多解释⽤法, 因为它和write()是完全相同的。⼆进制⽂件⽐ASCII⽂件简单, 但有个缺点是⽆法⽤⽂本编辑器编辑。 ⼆进制⽂件使⽤⼆进制保存,打开后显⽰的是乱码,需要使⽤BinaryViewer打开。⽽ASCII⽂件显⽰的就是你想要的,和cout<< ⼀样。
写⽂件相关函数
只有⼀个你可能会关注的⽅法.那就是 put(char), 它每次向输出流中写⼊⼀个字符。
四、更多⽅法
检查⽂件
你已经学会了open() 和close() ⽅法, 不过这⾥还有其它你可能⽤到的⽅法。
⽅法good() 返回⼀个布尔值,表⽰⽂件打开是否正确。
类似的,bad() 返回⼀个布尔值表⽰⽂件打开是否错误。 如果出错,就不要继续进⼀步的操作了。
最后⼀个检查的⽅法是fail(), 和bad()有点相似, 但没那么严重。
五、C++⽂件的读取和写⼊程序举例:
C++⽂件的读取和写⼊程序举例1:
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main(){
char buffer[256];
ifstream myfile ("c:\\a.txt");
ofstream outfile("c:\\b.txt");
if(!myfile){
cout << "Unable to open myfile";
exit(1); // terminate with error
}
if(!outfile){
cout << "Unable to open otfile";
exit(1); // terminate with error
}
int a,b;
int i=0,j=0;
int data[6][2];ascii文件夹怎么创建
while (! f() )
{
sscanf(buffer,"%d %d",&a,&b);
cout<<a<<" "<<b<<endl;
data[i][0]=a;
data[i][1]=b;
i++;
}
myfile.close();
for(int k=0;k<i;k++)
{
outfile<<data[k][0] <<" "<<data[k][1]<<endl;
cout<<data[k][0] <<" "<<data[k][1]<<endl;
}
outfile.close();
return0;
}
C++⽂件的读取和写⼊程序举例2:
/*/从键盘读⼊⼀⾏字符,把其中的字母依次放在磁盘⽂件fa2.dat中,再把它从磁盘⽂件读⼊程序, 将其中的⼩写字母改成⼤写字母,再存⼊磁盘fa3.dat中*/
#i nclude<fstream>
#i nclude<iostream>
#i nclude<cmath>
using namespace std;
//从键盘上读取字符的函数
void read_save(){
char c[80];
ofstream outfile("f1.dat");//以输出⽅式打开⽂件
if(!outfile){
cerr<<"open error!"<<endl;//注意是⽤的是cerr
exit(1);
}
for(int i=0;c[i]!=0;i++) //对字符⼀个⼀个的处理,直到遇到'/0'为⽌
if(c[i]>=65&&c[i]<=90||c[i]>=97&&c[i]<=122){//保证输⼊的字符是字符
outfile.put(c[i]);//将字母字符存⼊磁盘⽂件
cout<<c[i]<<"";
}
cout<<endl;
outfile.close();
}
void creat_data(){
char ch;
ifstream infile("f1.dat",ios::in);//以输⼊的⽅式打开⽂件
if(!infile){
cerr<<"open error!"<<endl;
exit(1);
}
ofstream outfile("f3.dat");//定义输出流f3.dat⽂件
if(!outfile){
cerr<<"open error!"<<endl;
exit(1);
}
(ch)){//当读取字符成功时
if(ch<=122&&ch>=97)
ch=ch-32;
outfile.put(ch);
cout<<ch;
}
cout<<endl;
infile.close();
outfile.close();
}
int main(){
read_save();
creat_data();
system("pause");
return0;
}
C++⽂件的读取和写⼊程序举例3:
Example : 从in.txt ⽂件中读⼊数据,并输出到中,输出的⽂件中每⾏之间有⼀空⾏相隔
#include
#include
#include
using namespace std;
int main (int){
string s;
ifstream inf;
inf.open("in.txt");
//打开输出⽂件
ofstream outf;
outf.open("");
//从in.txt ⽂件中读⼊数据,并输出到中
/*其中 getline(参1,参2); 作⽤是从 inf 指向的⽂件中
每次读⼊⼀⾏,把数据存到字符串s中,从第⼀⾏开始
 每读完⼀⾏后,系统⾃动地把指针指向下⼀⾏,不⽤⼈为
 ⼲预*/
while( getline(inf,s ) ){
outf << s  << '\n\n';                //我这⾥并没有⽤到字符串
cout << s  << endl << endl;            //数组,⽽是只⽤了⼀个串
}                            //S,是因为我每次读⼊⼀⾏
//后,⽴即就把它输出到
//中,跟着读下⼀⾏
inf.close();
outf.close();
return0;
}
=============== ⽅法⼆ ================

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。