文件输入输出问题

lw1a2 2006-09-17 12:24:09
/*文件copy.out的内容:
abcd
efg
hi
j

计算每行的字节数,将结果加到最后一行,最后计算整个文件的字节数。
完成后的文件内容应该是:

abcd
efg
hi
j
5 9 12 14 24

*/

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


int main()
{
fstream inOut("copy.out",ios_base::in|ios_base::app);
int cnt = 0;
char ch;

inOut.seekg(0);
while ( inOut.get( ch ))
{
cout.put( ch );
cnt++;
if ( ch == '\n' )
{
ios::pos_type mark = inOut.tellg();//保存文件当前位置
inOut.seekg(0,ios_base::end);//写在文件尾
inOut << cnt << ' ';
inOut.seekg( mark );//恢复位置
}
}
inOut.clear();
inOut << cnt << endl;

cout << "[ " << cnt << " ]"<<endl;
system("pause");
return 0;
}

--------------------------------------------------------
以上这段代码,在VC2005里正确执行,在DevCpp4.9.9.2里,文件没有改变。
大家看看有什么问题
...全文
332 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw1a2 2006-09-28
  • 打赏
  • 举报
回复
刚才加上binary,DevCPP执行的结果和GCC的一样。看来这个windows下的GCC,处理回车确实有问题
taodm 2006-09-28
  • 打赏
  • 举报
回复
你没有用binary模式打开文件,遇到了\r\n转换问题。

说个和问题无关的,为啥不用getline每次读一行,然后一次写入总结果?
KenYuan2016 2006-09-18
  • 打赏
  • 举报
回复
ios::app 类似功能,在许多编译器下的特性并不完全一致。
有些编译器不认识ios::。。
比如认识ios::app的,有些编译器发现没有该文件会报错,有些却会自动创建该文件。
KenYuan2016 2006-09-18
  • 打赏
  • 举报
回复
你可以使用ifstream
用Gcc再看看。
ifstream input_file("filename");
//判断文件可用
{ }
//循环
while()
{
...
input_file >>---;
...
}
lw1a2 2006-09-17
  • 打赏
  • 举报
回复
j后面本来就有回车
Arthur_ 2006-09-17
  • 打赏
  • 举报
回复
在文件最後一行也就是j後面加一個 回車
jixingzhong 2006-09-17
  • 打赏
  • 举报
回复
看看 ~
lw1a2 2006-09-17
  • 打赏
  • 举报
回复
但是GCC的结果是:
abcd
efg
hi
j
6 11 15 18 29
lw1a2 2006-09-17
  • 打赏
  • 举报
回复
换成换成ios_base::in|ios_base::out后,GCC运行成功了

怀疑是DevCPP的一个bug,每次tellg的时候,就出问题
lw1a2 2006-09-17
  • 打赏
  • 举报
回复
g++的确不行,没VC6,没法试

我怀疑是ios_base::in|ios_base::app的问题

换成ios_base::in|ios_base::out也不对
Arthur_ 2006-09-17
  • 打赏
  • 举报
回复
我在vc6.0 g++中都打不開文件,你們可以打開?
Arthur_ 2006-09-17
  • 打赏
  • 举报
回复
程序牙根沒進循環里面哦,怎麼半怎麼半
jixingzhong 2006-09-17
  • 打赏
  • 举报
回复
o ......
jixingzhong 2006-09-17
  • 打赏
  • 举报
回复
int main(void)
{
ifstream in("test.txt");
int cnt = 0;
string line, out="";
while(!in.fail())
{
getline(in, line);
cout<<line<<endl;

char tmp[10];
cnt += line.length()+1;
sprintf(tmp,"%d ", cnt);
out += tmp;
}
cnt += out.length()+1;
cout << "[ " << cnt << " ]"<<endl;
//然后输出 out 串到文件中去 ...
system("pause");
return 0;
}
lw1a2 2006-09-17
  • 打赏
  • 举报
回复
其实我的问题是为什么VC2005没问题,DevCPP不行
jixingzhong 2006-09-17
  • 打赏
  • 举报
回复
把 读和写 两个过程独立出来 ...
jixingzhong 2006-09-17
  • 打赏
  • 举报
回复
fstream inOut("copy.out",ios_base::in|ios_base::app);

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧