精华内容
下载资源
问答
  • 学习C++:使用std::fstream处理文件

    千次阅读 2020-02-14 14:11:46
    在上一篇博文https://blog.csdn.net/wjinjie/article/details/104301129中,总结了标准...因此本次主要介绍用于操作文件的输入和输出流std::fstreamfstream从ofstream那里继承了写入文件的功能,并从ifstream那里...

    在上一篇博文https://blog.csdn.net/wjinjie/article/details/104301129中,总结了标准输出流cout和标准输入流cin的用法。在使用C++做项目的过程中,经常会遇到处理文件(创建、读、写文件)的时候。因此本次主要介绍用于操作文件的输入和输出流std::fstream,fstream从ofstream那里继承了写入文件的功能,并从ifstream那里继承了读取文件的功能。
    要使用std::fstream类或其基类(ofstream和ifstream),都需要包含头文件:

    #include <fstream>
    

    1.使用open()和close()打开和关闭文件

    (1)要使用fstream类,需要使用open()打开文件

    fstream myFile; //实例化一个文件对象
    myFile.open("firstFile.txt", ios_base::in | ios_base::out | ios_base::trunc); //打开文件firstFile.txt,可选择三种模式
    if(mfFile.is_open()) //检测open()是否成功
    {
    	Dosomething();   //读或写操作
    	myFile.close();  //关闭文件流以保存其内容,这一步不能忘
    }
    

    open(“文件名的路径和名称”, ios_base::in | ios_base::out | ios_base::trunc)
    第一个参数:是要打开文件的路径和名称(若没有提供路径,默认为应用程序的当前目录)
    第二个参数:是文件的打开模式。ios_base::in(可读取文件)、ios_base::out(可写入文件)、ios_base::trunc(即便指定的文件存在,也重新创建它)
    (2)除了使用open()打开文件,还可以使用fstream类的构造函数打开文件

    //使用构造函数打开文件
    fstream myFile("firstFile.txt", ios_base::in | ios_base::out | ios_base::trunc); 
    //如果只想打开文件进行写入
    ofstream myFile("firstFile.txt", ios_base::out);
    //如果只想打开文件进行读取
    ifstream myFile("firstFile.txt", ios_base::in);
    

    注意:无论是使用成员方法open()还是构造函数来打开文件流,都建议在使用文件流对象前,使用is_open()检查文件打开操作是否成功。

    2.使用open()创建文本文件并使用运算符<<写入文件

    下面将演示使用ofstream新建一个文本文件并向其中写入文本:

    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	ofstream myFile;
    	myFile.open("firstFile.txt", ios_base::out); //以只写模式打开文件
    	if(myFile.is_open())
    	{
    		cout<<"File open successful"<<endl;
    		//使用运算符<<写入文件
    		myFile<<"Hello File!"<<endl;
    		myFile<<"Writing in file";
    		myFile.close(); //关闭文件以保存其内容
    	}
    	return 0;
    }
    

    注:程序表明写入文件的方式与使用cout写入到标准输出的方式相同,都采用运算符<<。

    3.使用open()和运算符>>读取文本文件

    要读取文件,使用fstream或者ifstream,并使用标志ios_base::in打开它。下面将演示如何从已有的文件firstFile中读取文本:

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	ifstream myFile;
    	myFile.open("firstFile", ios_base::in);
    	if(myFile.is_open())
    	{
    		cout<<"文件打开成功!文件中包含以下内容:"<<endl;
    		string fileContents;
    		while(myFile.good())  //判断当前流的状态是否正常。即当读到文件末尾时,自动跳出循环。
    		{
    			getline(myFile, fileContents);  //每次从文件中读取一行
    			cout<<fileContents<<endl;
    		}
    		myFile.close();
    	}
    	else
    		cout<<"打开文件失败,检查文件是否在正确的目录下!"<<endl;
    	return 0;
    }
    

    注:这里没有使用提取运算符>>将文件内容直接读取,而是使用getline()从文件流中读取每一行,直到文本末尾。

    展开全文
  • std::fstream

    千次阅读 2017-02-21 13:54:33
    当way=std::ifstream::beg,off即字符索引,此时seekg(off, std::ifstream::beg)等价于seekg(off),意为将当前位置设置为索引为offset的字符 说明: ①若failbit, badbit任何一个被置位,则seekg失效,不起...

    ifstream


    std::ifstream::end

    位于最后一个字符的下一个位置


    ifstream()

    函数原型:ifstream(const char *filename, std::ifstream::openmode mode);

    说明:与open()相同,参考open()


    open()

    函数原型:void open(const char *filename, std::ifstream::openmode mode);

    功能:打开文件

    参数:mode可选值如下

    std::ifstream::in            读方式打开

    std::ifstream::binary     以二进制而非文本格式进行操作

    说明:

    ①检查open操作是否成功:if(fin), if(fin.good());检查是否失败:if(!fin), if(!fin.good())

    ②读写非文本文件,必须加std::ifstream::binary


    tellg()

    函数原型:int tellg();

    功能:返回输入流中的当前字符位置

    说明:

    ①返回值为当前字符索引,起始索引为0

    ②返回值的意义:已读字符个数

    ③读操作,从当前位置的字符开始读取

    ④C++98和0x,若failbit, badbit任何一个被置位,则该函数返回-1

    ⑤C++11,若eofbit, failbit, badbit任何一个被置位,则该函数返回-1

    示例:


    若当前字符位置指向方块,则tellg()值为4,因为方块的索引号为4,表示已读字符数为4(方块之前的四个),read()操作的第一个字符为方块


    seekg()

    函数原型:

    std::istream& seekg(int pos);

    std::istream& seekg(int off, ❀ way);

    功能:设置当前位置

    参数:pos表示绝对位置,即字符索引;off表示相对way的字节偏移,正为前,负为后;

    way涵义如下

    std::ifstream::beg   起始位置,位于第一个字符,即索引0处

    std::ifstream::end   结束位置,位于最后一个字符的下一个位置

    std::ifstream::cur    当前位置

    当way=std::ifstream::beg,off即字符索引,此时seekg(off, std::ifstream::beg)等价于seekg(off),意为将当前位置设置为索引为offset的字符

    说明:

    ①若failbit, badbit任何一个被置位,则seekg失效,不起任何作用

    ②eofbit对seekg无影响,即使被置位,seekg也能调用成功,当前位置改变

    ③C++98和0x,seekg不改变eofbit

    ④C++11,无论把当前位置设置成何处,只要调用seekg,eofbit即被清零


    read()

    函数原型:std::istream& read(char *s, int n);

    功能:从输入流读取n个字符到s

    说明:

    ①如果输入流中的字符数小于n,则全部读取,存入s,同时置eofbit和failbit

    ②字符数恰好等于n的情况下,全部读取,存入s,无任何bit被置位

    只要fin.good()不为true,即eofbit, failbit, badbit任何一个被置位,则读操作必失败


    operator>>()

    函数原型:

    template <typename T> 

    std::istream& operator>>(T &t);

    功能:按格式读取数据

    说明:只要fin.good()不为true,即eofbit, failbit, badbit任何一个被置位,则读操作必失败


    clear()

    函数原型:void clear(std::ifstream::iostate state = goodbit);

    功能:设置流的错误状态标志

    示例:设置流的eofbit和failbit位,过程如下:

    fin.clear(std::ifstream::eofbit | std::ifstream::failbit);


    rdstate()

    函数原型:std::ifstream::iostate rdstate() const

    功能:返回流的内部错误状态标志

    示例:清除流的failbit位,过程如下:

    fin.clear(fin.rdstate() & ~std::ifstream::failbit);


    good()

    函数原型:bool good() const;

    功能:判断eofbit, failbit, badbit均没有置位


    eof()

    函数原型:bool eof() const;

    功能:判断eofbit已置位


    fail()

    函数原型:bool fail() const;

    功能:判断failbit或badbit已置位


    operator bool()

    函数原型:operator bool() const;

    本质:类型转换运算符

    功能:判断failbit和badbit均没有置位


    operator!()

    函数原型:bool operator!() const;

    本质:重载运算符函数

    功能:判断failbit或badbit已置位



    展开全文
  • 如何使用std::fstream处理文件

    千次阅读 2018-12-27 23:57:56
    std::fstream旨在以独立于平台的方式处理文件。 std::fstreamstd::ofstream那里继承了写入文件的功能,并从std::ifstream那里继承了读取文件的功能,从而能够提供读写的功能。 要使用fstream、ofstream和...

    std::fstream旨在以独立于平台的方式处理文件。

    std::fstream从std::ofstream那里继承了写入文件的功能,并从std::ifstream那里继承了读取文件的功能,从而能够提供读写的功能。

    要使用fstream、ofstream和ifstream类时,需要使用方法open打开文件

    其原型是:

    imbue(locale("chs"));//设置中文模式
    
    void open(const char* filename,int mode,int access);
    
    //filename:     要打开的文件名
    //mode:    要打开文件的方式
    //access:    打开文件的属性
    

    打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

    //ios::app:   以追加的方式打开文件
    //ios::ate:   文件打开后定位到文件尾,ios:app就包含有此属性
    //ios::binary:    以二进制方式打开文件,缺省的方式是文本方式。
    //ios::in:     文件以输入方式打开
    //ios::out:   文件以输出方式打开
    //ios::nocreate: 不建立文件,所以文件不存在时打开失败 
    //ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
    //ios::trunc:  如果文件存在,把文件长度设为0
    

    可以用“或”把以上属性连接起来,如ios::out|ios::binary

    打开文件的属性取值是:

    0:普通文件,打开访问
    1:只读文件
    2:隐含文件
    4:系统文件

    可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。

    例如:以二进制输入方式打开文件c:config.sys

    fstream file1;
    file1.open("c:\config.sys",ios::binary|ios::in,0);
    
    //如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:
    
    file1.open("c:\config.sys");<=>file1.open("c:\config.sys",ios::in|ios::out,0);
    
    //fstream还有和open()一样的构造函数
    //对于上例,在定义的时侯就可以打开文件
    
    fstream file1("c:\config.sys");
    
    //fstream有两个子类:ifstream(input file stream)
    //和ofstream(outpu file stream)
    //ifstream默认以输入方式打开文件
    //而ofstream默认以输出方式打开文件。
    
    ifstream file2("c:\pdos.def");//以输入方式打开文件
    ofstream file3("c:\x.123");//以输出方式打开文件
    

    所以,在实际应用中,根据需要的不同,选择不同的类来定义:
    如果想以输入方式打开,就用ifstream来定义;
    如果想以输出方式打开,就用ofstream来定义;
    如果想以输入/输出方式来打开,就用fstream来定义。

    打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:

    file1.close();//就把file1相连的文件关闭
    

    读写文件分为文本文件和二进制文件的读取:
    对于文本文件的读取比较简单,用插入器和析取器就可以了;
    而对于二进制的读取就要复杂些

    文本文件的读写
      
    文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:

    file2<<"I Love You";//向文件写入字符串"I Love You"
    int i;
    file1>>i;//从文件输入一个整数值
    

    这种方式还有一种简单的格式化能力,
    比如可以指定输出为16进制等等

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

    二进制文件的读写
    ①put()
      put()函数向流写入一个字符,
      其原型是ofstream &put(char ch),
      使用也比较简单

    file1.put('c');//就是向流写一个字符'c'
    

    ②get()
      get()函数比较灵活,有3种常用的重载形式:

    一种就是和put()对应的形式:ifstream &get(char &ch);
    功能是从流中读取一个字符,结果保存在引用ch中,
    如果到文件尾,返回空字符。

    file2.get(x);//表示从文件中读取一个字符,并把读取的字符保存在x中
    

    另一种重载形式的原型是:
    int get();这种形式是从流中返回一个字符,
    如果到达文件尾,返回EOF

    x=file2.get();//和上例功能是一样的
    

    还有一种形式的原型是:
    ifstream &get(char *buf,int num,char delim=’ ‘);
    这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符’ '。

    file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止
    

    ③读写数据块

    要读写二进制数据块,使用成员函数read()和write()成员函数,
    它们原型如下:

    read(unsigned char *buf,int num);
    write(const unsigned char *buf,int num);
    

    read()从文件中读取 num 个字符到 buf 指向的缓存中,
    如果在还未读入 num 个字符时就到了文件尾,
    可以用成员函数 int gcount();来取得实际读取的字符数;
    而 write() 从buf 指向的缓存写 num 个字符到文件中,
    值得注意的是缓存的类型是 unsigned char *,
    有时可能需要类型转换。

    unsigned char str1[]="I Love You";
    int n[5];
    ifstream in("xxx.xxx");
    ofstream out("yyy.yyy");
    out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中
    in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换
    in.close();out.close();
    

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

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

    和C的文件操作方式不同的是,
    C++ I/O系统管理两个与一个文件相联系的指针。
    一个是读指针,它说明输入操作在文件中的位置;
    另一个是写指针,它下次写操作的位置。
    每次执行输入或输出时,相应的指针自动变化。
    所以,C++的文件定位分为读位置和写位置的定位,
    对应的成员函数是 seekg()和 seekp(),
    seekg()是设置读位置,seekp是设置写位置。

    istream &seekg(streamoff offset,seek_dir origin);
    ostream &seekp(streamoff offset,seek_dir origin);
    

    streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:

    //ios::beg:  文件开头
    //ios::cur:  文件当前位置
    //ios::end:  文件结尾
    

    这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

    file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节
    
     file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节
    
    #include<iomanip.h>
    #include<fstream.h>
    void main()
    {
      ofstream f1("d:\\me.txt");//打开文件用于写,若文件不存在就创建它
      if(!f1)return; //打开文件失败则结束运行
      f1<<setw(20)<<"姓名:"<<"廉东方"<<endl;//使用插入运算符写文件内容
      f1<<setw(20)<<"家庭地址:"<<"河南郑州"<<endl;
      f1.close();   //关闭文件
    }
    

    文件操作:
    打开文件
    文件名
    注意路径名中的斜杠要双写,如:
     “D:\MyFiles\ReadMe.txt”

    文件打开方式选项:

    ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)
    
    ios::out    = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
    
    ios::ate    = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
    
    ios::app    = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
    
    ios::trunc   = 0x10, //在读写前先将文件长度截断为0(默认)
    
    ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
    
    ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
    
    ios::binary  = 0x80  //二进制格式文件
    

    文件保护方式选择项:

    filebuf::openprot;   //默认的兼容共享方式
    
    filebuf::sh_none;    //独占,不共享
    
    filebuf::sh_read;    //读共享
    
    filebuf::sh_write;   //写共享
    

    打开文件的方法

    //调用构造函数时指定文件名和打开模式
    
    ifstream f("d:\\12.txt",ios::nocreate);  //默认以 ios::in 的方式打开文件,文件不存在时操作失败
    
    ofstream f("d:\\12.txt");       //默认以 ios::out的方式打开文件
    
    fstream f("d:\\12.dat",ios::in|ios::out|ios::binary); //以读写方式打开二进制文件
    
    //使用Open成员函数
    fstream f;
    
    f.open("d:\\12.txt",ios::out);    //利用同一对象对多个文件进行操作时要用到open函数
    

    检查是否成功打开

    //成功:
    
    if(f){...}       //对ifstream、ofstream对象可用,fstream对象不可用。
    
    if(f.good()){...}
    //失败:
    
    if(!f){...}       // !运算符已经重载
    
    if(f.fail()){...}
    

    读写操作

    使用<<,>>运算符

    只能进行文本文件的读写操作,用于二进制文件可能会产生错误。

    使用函数成员 get、put、read、write等

    经常和read配合使用的函数是gcount(),用来获得实际读取的字节数。

    读写二进制文件注意事项
      
    打开方式中必须指定ios::binary,否则读写会出错

    用read\write进行读写操作,而不能使用插入、提取运算符进行操作,否则会出错。

    使用eof()函数检测文件是否读结束,使用gcount()获得实际读取的字节数

    关闭文件

    使用成员函数close,如:

    f.close(); 
    

    利用析构函数

    对象生命期结束时会检查文件是否关闭,对没有关闭的文件进行关闭操作。

    随机读写文件

    通过移动文件读写指针,可在文件指定位置进行读写。

    seekg(绝对位置);      //绝对移动,    //输入流操作
    
    seekg(相对位置,参照位置);  //相对操作
    
    tellg();          //返回当前指针位置
    
    seekp(绝对位置);      //绝对移动,    //输出流操作
    
    seekp(相对位置,参照位置);  //相对操作   
    
    tellp();          //返回当前指针位置
    

    参照位置:

    ios::beg  = 0       //相对于文件头
    
    ios::cur  = 1       //相对于当前位置
    
    ios::end  = 2       //相对于文件尾
    

    读写文本文件的示例

    //为能够正确读出写入文件的各数据,各数据间最好要有分隔
    
    #include<fstream.h>
    void main()
    {
      fstream f("d:\\try.txt",ios::out);
      f<<1234<<' '<<3.14<<'A'<<"How are you"; //写入数据
      f.close();
      f.open("d:\\try.txt",ios::in);
      int i;
      double d;
      char c;
      char s[20];
      f>>i>>d>>c;               //读取数据
      f.getline(s,20);
      cout<<i<<endl;             //显示各数据
      cout<<d<<endl;
      cout<<c<<endl;
      cout<<s<<endl;
      f.close();
    }
    运行结果:
    1234
    3.14
    A
    How are you
    Press any key to continue
    
    //使用get()一次读一个字符
    
    #include<fstream.h>
    void main()
    {
      ifstream fin("d:\\简介.txt",ios::nocreate);
      if(!fin){
        cout<<"File open error!\n";
        return;
      }
      char c;
      while((c=fin.get())!=EOF)cout<<c;    //注意结束条件的判断
      fin.close();
    }
    
    //使用get(char *,int n,char delim='\n')
    
    //巧妙利用文本文件中不会有字符'\0'的特点进行读取
    
    #include<fstream.h>
    void main()
    {
      ifstream fin("d:\\简介.txt",ios::nocreate);
      if(!fin){
        cout<<"File open error!\n";
        return;
      }
      char c[80];
      while(fin.get(c,80,'\0')!=NULL)cout<<c; //注意结束条件的判断
      fin.close();
    }
    
    //使用read(char *,int n)读文件
    
    #include<fstream.h>
    void main()
    {
      ifstream fin("d:\\简介.txt",ios::nocreate);
      if(!fin){
        cout<<"File open error!\n";
        return;
      }
      char c[80];
      while(!fin.eof())            //判断文件是否读结束
      {
        fin.read(c,80);
        cout.write(c,fin.gcount());
      }
      fin.close();
    }
    

    拷贝文件

    //二进制文件操作示例
     
    #include<fstream.h>
    void main()
    {
      ifstream fin("C:\\1.exe",ios::nocreate|ios::binary);
      if(!fin){
        cout<<"File open error!\n";
        return;
      }
      ofstream fout("C:\\2.exe",ios::binary);
      char c[1024];
      while(!fin.eof())
      {
        fin.read(c,1024);
        fout.write(c,fin.gcount());
      }
      fin.close();
      fout.close();
      cout<<"Copy over!\n";
    }
    
    展开全文
  • std::fstream 一些经验

    千次阅读 2019-03-25 10:33:38
    在做实验的时候遇到这个问题,找原因的时候发现出处除了讲明原因,还举了例子,所以记下来。 其实在循环判断文件是否结束的时候可以直接就流输入放在循环条件那里,但是... fstream流的eof() 判断有点不合常理 ...

    在做实验的时候遇到这个问题,找原因的时候发现出处除了讲明原因,还举了例子,所以记下来。

    其实在循环判断文件是否结束的时候可以直接就流输入放在循环条件那里,但是这里补充使用eof()的一些细节问题。其实这是关于到底什么时候标志位才会变化的问题。总结起来就是只有使用一次流变量来输入输出,标志位才会更新一次。

     

    正文:

     

     

       fstream流的eof()  判断有点不合常理

     

     

       按正常逻辑来说,如果到了文件末尾的话 ,那eof()应返回真

     

       但是,c++输入输出流如何知道是否到末尾呢?

     

       原来是根据的是: 如果fin>>不能再读入数据了,才发现到了文件结尾,这时才给流设定文件结尾的标志,此后调用eof()时,才返回真。

     

     

       假设

     

       fin>>x; //此时文件刚好读完最后一个数据(将其保存在x中)

     

       但是, 这时 fin.eof()仍未假 因为,fin流的标志eofbit是FALSE, fin流此时认为文件还没有到末尾

     

       只有当流再次读写时

     

       fin>>x; 发现已无可读写数据,此时流才知道到达了结尾,这时才将标志eofbit修改为TRUE

     

       此时流才知道了文件到底了末尾

     

     

     

       也就是说,eof在读取完最后一个数据后,仍是False,

     

                      当再次试图读一个数据时,由于发现没数据可读了 才知道到末尾了,此时才修改标志,eof变为TRUE

     

     

     

     

     

      以下例子:

     

    复制代码

     1  ifstream fin("D://line.txt");
     2 
     3  ofstream fout("D://T_line.txt",ios::trunc);
     4 
     5 
     6  list<tag_Point> test_list;
     7 
     8  tag_Point test; 
     9 
    10  
    11 
    12  while (!fin.eof())
    13  {
    14   
    15 
    16 
    17   fin>>test.x;
    18   fin>>test.y;
    19   fin>>test.z;
    20 
    21 
    22  
    23 
    24   test_list.push_back(test);
    25   
    26 
    27  }
    28 
    29    fin.close();
    30 
    31    

    复制代码

     

     

     在运行时 发现  test_list中的数据比文本中的数据多一行,也就是 文本中最后一行的数据写了两遍

     

     始终无法理解

     

      现在明白了:》

     

      再读完最后一行后,

     

      因为fin.eof()仍为假, 所以会继续while循环

     

      当执行到while的第一个语句   fin>>test.x时,发现无可读数据了,此时修改流属性,fin.eof ()变为TRUE

     

      再执行   fin>>test.y; fin>>test.z;时,因为已经到文件末尾了 ,所以 test保留了上次的值,也即test中的值为变,还是文本最后一行

     

    的数据

     

      此时再push_back(test),压入列表的仍是最后一行数据

     

      由此导致了,列表中的数据比文本中的数据多一行

     

     

     

    ---------------------

     

     

    知道了原因 ,便很好作出修改了

     

     

      修改为:

     

    复制代码

     1  while (  fin>>test.x&&fin>>test.y&& fin>>test.z)
     2  {
     3   
     4 
     5   test_list.push_back(test);
     6   
     7 
     8  }
     9 
    10    fin.close();

    复制代码

     

     

     这样便没问题了 ,当读取完最后一行数据后,将其放入列表中,此时判断while条件,也就是再次读取数据,发现无数据可读,读取不成功 fin>>test.x返回False 由此结束循环。

     

     

     

     

    参考资料:

       

       http://zhidao.baidu.com/question/121339522.html?fr=im

      

       http://topic.csdn.net/u/20091014/12/4182ffd1-055c-490e-bfc5-9b82a9004144.html?seed=588522249&r=60404137#r_60404137

    展开全文
  • std::fstream流位置

    2016-08-21 08:09:58
    对输入流操作:seekg()与tellg() 对输出流操作:seekp()与tellp() 下面以输入流函数为例介绍用法: seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。...
  • std::fstream 中文路径

    2015-04-14 19:47:00
    std::fstream 中文路径 eryar@163.com 用C++来开发管道出图程序IsoAlgo时,当PCF文件名中包含中文时,读取文件会失败。将下面数据存成一个简单文件:中文.txt 放到目标目录中来测试: Figure 1 包含中文的文件 ...
  • C++文件读写操作std::ofstream和std::ofstream
  • std::fstream无法直接处理中文目录,解决方法之一如下 locale::global(locale("")) file.open("d:\\中文路径.txt"); locale::global(locale("C")); //还原,否则cout有问题 不过如此一来, file ...
  • 今天碰到这个问题了,是在使用Crypto++库的时候遇到的,该库操作文件是使用的std::ifstream。在我给文件生成签名的时候,每每碰到中文路径名就出错,后来跟进库代码一看是打开文件的时候出错。 据说这个问题在VS...
  • 碰到的问题: 今天碰到这个问题了,是在使用Crypto++库的时候遇到的,该库操作文件是使用的std::ifstream。在我给文件生成签名的时候,每每碰到中文路径名就出错,后来跟进库代码一看是打开文件的时候出错。据说这...
  • C++ std::fstream open mode

    千次阅读 2012-02-24 13:08:49
    ios::app: 以追加的方式打开文件  ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性  ios::binary: 以二进制方式打开文件,缺省的方式是...添加:std::locale::global(std::locale("")); 
  • C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const) C++使用fstream进行文件读写,非常的方便,但是在日常使用的时候,常常会忽视掉一些小问题,如下: 类...
  • I am using an std::ofstream and I am not looking for a Boost solution. 解决方案 This is one of my favorite tuck-away functions I keep on hand for multiple uses. #include // Function: fileExists /** ...
  • 包含头文件 #include #include #include #include #include #include ...typedef std::string TSString;...typedef std::vector TSStringVec;...1.1、std::fstream读写文件 //使用fstream写文件;
  • bug1: 在定义print函数的时候,文件输出流没有定义成引用导致以下报错: use of deleted function ‘std::...::basic_fstream(const std::basic_fstream<_CharT, _Traits>&) [with _CharT = char; _Tr...
  • 在使用std::ofstream写文件时,编译器提示如下错误: error: variable ‘std::ofstream ofs’ has initializer but incomplete type std::ofstream ofs(string(TMP_STATE_FILE));...fstream> ...
  • C++使用fstream进行文件读写,非常的方便,但是在日常使用的时候,常常会忽视掉一些小问题,如下: 环境: Ubuntu16.04 g++: 5.4.0 例如以上代码,在编写时可能察觉不到问题的所在,但编译时就会报如下错: ...
  • 现在,首先介绍unicode模式下的CString与std::string相互转,我认为最根本的就是把UTF-16转成UTF-8,反之亦然。 个人认为最简单的一种方法:CStringA()这个强制类型转换很好用 这样就可以把 UNICODE 版本字符...
  • fstream>头文件以后,上面的两个错误就解决了。上面的两个错误主要还是因为没有头文件,具体问题具体分析,不一定对应所有的答案,大家自己甄别。 附上: ofstream的使用方法–超级精细。C++文件写入、读出函数...
  • c++ istream转换为std::string

    千次阅读 2017-04-16 21:38:00
    std::istreambuf_iterator&lt;char&gt; eos; std::string s(std::istreambuf_iterator&lt;char&gt;(stream), eos);----------------------------------------------------------------------------...
  • 使用std::stringstream对字符串进行转换

    千次阅读 2018-05-18 10:37:01
    fstream&gt; #include&lt;sstream&gt; #include&lt;iostream&gt; using namespace std; int main() { cout &lt;&lt; "Enter an integer: "; int input = 0; cin...
  • Read image to std::vector<std::vector> and write to image from std::vector...fstream> #include <string> #include <vector> #include <sstream> #include <stdio.h> using na
  • 问题: “in”使用未定义的 class“std::basic_ifstream<char,std::char_traits<char>>” 解决: #include<fstream>
  • 下述代码报错,原因是因为istream后漏了一个 & //从输入流中将家庭作业的成绩读入到一个vector<double>中 istream read_hw(istream& in, vector<double>& hw) ... //清除vector原先的内容 ...
  • c++ 编译报错——std::basic_ifstream::open

    千次阅读 2020-04-21 11:37:33
    c++ 编译报错——error: no matching function for call to ‘std::basic_ifstream::open(std::__cxx11::string&, const openmode&)’ 错误出现 之前在Mac上开发正常,然后换到ubutun上的时候就开始报错。...
  • std::ifstream::readsome的原型如下,可以返回实际读到的字节数量,但是不会把eofbit置1,所以不能直接调用eof判断是否到文件尾 streamsize readsome (char* s, streamsize n); std::ifstream::read原型如下,会...
  • std::getline (string) & std::stringstream::str

    千次阅读 2017-05-06 08:48:42
    #include #include #include #include #include using namespace std; const int MAXN=105; char s1[MAXN],s2[MAXN],s3[MAXN],s4[MAXN];int main() { string s;
  • error C2664: “void std::basic_fstream,_Traits>::open(const wchar_t ,std::ios_base::openmode,int)”: 不能将参数 1 从“std::string”转换为“const wchar_t ” 1> with 1> [ 1> _Elem=char, 1
  • C++/C++11中std::string用法

    千次阅读 2019-07-13 18:19:42
    C++/C++11中std::string使用汇总 #include "string.hpp" #include <string> #include <iostream> #include <cctype> #include <... // std::size_t ...fstream> /* typ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,099
精华内容 28,839
关键字:

std::fstream