fstream指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fstream指针相关的知识,希望对你有一定的参考价值。

VC++6.0。我通过子函数打开一个文本文件,然后返回一个fstream *型的指针,赋值给主函数里的一个变量fstream *inFile。但是在使用这个inFile的时候出了点问题,while(!inFile->eof())这一句可以通过编译,但实际运行到这句时程序会出错关闭。在打开文件的子函数里通过if(!inFile)判断文件已成功打开。求教~谢谢
关键代码如下:
main()

ifstream *sfile_open(char *sFileName);
ifstream *inFile=sfile_open("textsrl.txt");//调用子函数打开文件
while(!inFile->eof())//运行到这里就出错


ifstream *sfile_open(char *sFileName)

ifstream *inFile=new ifstream();
inFile->open(sFileName);
return(inFile);

sfile_open里面的 inFile是局部变量,它的内存存放的是一块内存的首地址, 当return后,inFile被释放,原inFile所在内存区域的值被修改,而不是new出的那个内存了。main中传入一个指针到sfile_open函数中,就不会有问题 参考技术A 调试下看看文件是否打开追问

通过调用inFile->is_open()显示文件已打开。

iostream/fstream中的输入输出流指针的绑定,tie函数的使用。

 

为了兼容c语言的输入输出,c++里面采用tie将输入输出流经行绑定,所以cin/cout并不是独立的。当执行cin时,cout同时会被执行。反之亦然。

by defalut,cin is tied to cout,and wcin is tied to wcout。

默认情况下,cin和cout是绑定在一起的,wcin和wcout是绑定在一起的。

也就是说默认情况下,我们执行

int a;
cin>>a;

用户输入abcd‘Enter‘

执行的过程是,先将abcd输入到流缓冲区中,然后从缓冲区中输出到a中。

同样

cout<<"Enter a number";

执行的过程是,先将"Enter a number."输入到缓冲区中再从缓冲区中输出到控制台上来。

由此可见,cin和cout其实并不是我们想象中的相反对立的两个函数。相反,这两个函数,其实执行的是同一个过程,都包含输入和输出。(前提是在默认情况下)

正是由于这种情况,当我们遇到数据集超大造成 cin TLE的时候,我们可能会认为这是cin的效率不及scanf的原因。其实是输入缓冲区,flush缓冲区,占用了时间。

接下来介绍一下,相关的库函数tie

看看标准库里面tie函数的定义,there‘s two overloads,两重重载。


<1>basic_ostream<char_type,traits_type>* tie() const;

<2>basic_ostream<char_type,traits_type>* tie(basic_ostream<char_type,traits_type>* tiestr);
 

第一个重载:returns a pointer to the tied output stream.直接返回一个当前绑定的输出流指针。

第二个重载:ties the object to tiestr and returns a pointer to the stream tied before the call, if any.将当前对象与tiestr流指针绑定,并且返回之前绑定的流指针,如果之前没有绑定其他流指针,则返回NULL。

两个重载返回值都是一个流指针,重载<2>的形参是一个待绑定的流指针。

看下面两个例子

#01、解绑默认的绑定,加快输入输出。

比如下面

using namespace std;
void
main() {
int i; cin.tie(&cout); cout<<"Enter a number.";
cin>>i; }

用户输入3‘Enter‘

代码执行的过程是,直接将“Enter a number."输出到控制台上,然后直接将用户输入的3读入到i中。

中间不经过缓冲区。

所以当我们要大量读取数据的时候可以tie函数解绑,来加快数据读取。

#02、指定绑定输入输出流,实现不同的输入输出功能。

 1 // redefine tied object
 2 #include <iostream>     
 3 #include <fstream>      
 4 using namespace std;
 5 int main() {
6 ostream *prevstr; 7 ofstream ofs; 8 ofs.open("test.txt"); 9 cout << "tie example:\n"; 10 *cin.tie() << "This is inserted into cout"; 11 prevstr = cin.tie(&ofs); 12 *cin.tie() << "This is inserted into the file"; 13 cin.tie(prevstr); 14 ofs.close(); 15 return 0; 16 }

将标准输入和文件输出绑定。

代码执行结果:

tie example:
This is inserted into cout

同时生成test文件

This is inserted into the file

这是因为第一个*cin.tie()等价于cout默认绑定的就是cout。

第二个*cin.tie()等价于ofs。

 

以上是关于fstream指针的主要内容,如果未能解决你的问题,请参考以下文章

iostream/fstream中的输入输出流指针的绑定,tie函数的使用。

C++入门文件流(fstream)介绍和使用

C++ fstream 详解

关于C++里的fstream

fstream怎么用

C++移动和获取文件读写指针(seekpseekgtellgtellp)