VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: fcuptfwfn

文件输入输出问题

[复制链接]

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-12-17 19:15:01 | 显示全部楼层
也就是说out和in是共享一个文件指针,out<<s1;后文件指针已经到了文件末尾了,再in>>s2时已经读不到内容了,除非调用seekp或刷新流,我这样理解对吗?
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-12-17 21:45:01 | 显示全部楼层
不对,是out<<s1这个操作是先把字符串写入缓存,只有缓存满或者刷新流,字符串才真正写到文件中。也就是说在你in>>s2的时候,文件还是空的呢。
回复

使用道具 举报

0

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-12-18 10:45:01 | 显示全部楼层
好贴
不过用vc6.0时,要#include <sstream>才能编译通过
用bcb就不用
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-12-18 14:00:01 | 显示全部楼层
那为什么out<<s1;后调用out.seekp(0);就可以呢?seekp(0)不是使指针指向了文件首处吗?

还有个问题,在上面提到的,想建立输入输出文件流,可程序却没有建立文本,请问我应该怎么做?
程序如下:
#include<iostream>
#include<conio.h>
#include<fstream>


using namespace std;

int main()
{fstream file("a.txt",ios::in|ios::out);//建立输入输出文件流
string s1,s2;

  s1="abcd 1234\n";
  
  file<<s1;   
  getline(file,s2);
  
  cout<<"s2="<<s2<<endl;
  
  file.close();

getch();
return 0;
}
回复

使用道具 举报

0

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-12-18 20:00:01 | 显示全部楼层
搂主试试在输入之前关闭输出流
关闭输出流前文件应该是空的
或者这样
ifstream in("filename",ios::in|ios::out);
ostream out(in.rabuf());
这样输入输出流将使用同一个缓冲区
即使未写入文件,也可以将它读出来(读自缓冲区)
回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-12-18 21:15:01 | 显示全部楼层
#include<iostream>
#include<conio.h>
#include<fstream>
#include<string>

using namespace std;

int main()
{
        ofstream ofile("a.txt");//建立输入输出文件流
string s1,s2;

s1="abcd 1234\n";
if(!ofile)
{
        cout<<"cannot open!"<<endl;
        return 1;
}

ofile << s1;
ofile.close();
ifstream ifile("a.txt");
if(!ifile)
{
        cout<<"cannot open!"<<endl;
        return 1;
}
getline(ifile,s2);
ifile.close();
cout<<"s2="<<s2<<endl;



getch();
return 0;
}
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-12-19 10:45:02 | 显示全部楼层
难道只能定义ifstream和ofstream吗?
只定义一个fstream来完成输入输出的工作不行吗?
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-12-19 19:45:01 | 显示全部楼层
不行
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-12-19 20:45:01 | 显示全部楼层
// io/rw1. cpp

   #include <iostream>
   #include <fstream>
   using namespace std;

   int main()
   {
       // open file "example.dat" for reading and writing
       filebuf buffer;
       ostream output(&buffer);
       istream input(&buffer);
       buffer.open ("example.dat", ios::in | ios::out | ios::trunc);

       for (int i=1; i<=4; i++) {
           // write one line
           output << i << ". line" << endl;

          // print all file contents
          input.seekg(0);              //seek to the beginning
          char c;
          while (input.get(c)) {
              cout.put(c);
          }
          cout << endl;
          input.clear();               //clear eofbit and failbit
       }
   }

                               
The output of the program is as follows:

                                       
   1. line

   1. line
   2. line

   1. line
   2. line
   3. line

   1. line
   2. line
   3. line
   4. line

回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-12-19 22:00:01 | 显示全部楼层
首先要明白一点,打开文件的是streambuf而不是istream,也不是ostream,所以要令in/out可以对同一文件操作就需要令他们与同一个streambuf绑定,如上面的filebuf,这样就可以对一个文件即读又写了。
其次,两者用的是同一指针,所以写入filebuf完后要读取,则得调用seekg(0),返回开始的地方
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表