+ -
当前位置:首页 → 问答吧 → c++的文件操作

c++的文件操作

时间:2011-11-29

来源:互联网

第一个问题是我想算出一个文件的字节大小,但是程序运行得到的字节数,总是大于windows系统中的字节数,我不知道是为什么,代码如下(2.doc,只有8个字节,但是用下面代码算出来是9个字节,可以拷贝了在自己环境下运行一下,我的是vs2008):
复制内容到剪贴板
代码:
/**************************读不出正确的字节数目???*******************************************/
        /*char ch=0;
        int k=0;
        int s=0;
        fstream fs("D:\\2.doc",ios_base::in|ios_base:ut|ios_base::app);
        if(fs)
        {
                while(!fs.eof())
                {
                        fs.get(ch);
                        k++;
                        s+=sizeof(ch);
                }
        }
        fs.close();
        cout<<"the size of the file is"<<" "<<s<<"bytes"<<endl;
        cout<<k<<ends;
        */
还有一个问题就是关于输入流的问题,代码如下:
复制内容到剪贴板
代码:
        char ch;
        while(!cin.eof())
        {
                cin>>ch;
                if(ch=='q') break;
                else cout<<ch<<"  "<<ends;
        }
但是当输入q的时候程序并没有推出循环,我想问这是为什么?

作者: isyf   发布时间: 2011-11-29

我用fstream 文件流对象,算一下一个文件的字节大小,但是,算出来的结果总是比实际的结果大,不不知道为什么,代码如下:
复制内容到剪贴板
代码:
/**************************读不出正确的字节数目???*******************************************/
        /*char ch=0;
        int k=0;
        int s=0;
        fstream fs("D:\\2.doc",ios_base::in|ios_base::out|ios_base::app);
        if(fs)
        {
                while(!fs.eof())
                {
                        fs.get(ch);
                        k++;
                        s+=sizeof(ch);
                        //fs.seekg((int)(fs.tellg()+1));
                }
        }
        fs.close();
        cout<<"the size of the file is"<<" "<<s<<"bytes"<<endl;
        cout<<k<<ends;
*/
还有一个问题是关于cin流的:# W7 K5 }# `& D+ K" k
代码如下:
复制内容到剪贴板
代码:
        char ch;
        while(!cin.eof())
        {
                cin>>ch;
                if(ch=='q') break;
                else cout<<ch<<"  "<<ends;
        }
但是当输入了'q'时并没有退出程序,这是为什么??

作者: isyf   发布时间: 2011-11-29

复制内容到剪贴板
代码:
/**************************读不出正确的字节数目???*******************************************/
/*char ch=0;
int k=0;
int s=0;
fstream fs("D:\\2.doc",ios_base::in|ios_base:ut|ios_base::app);
if(fs)
{
while(!fs.eof())
{
fs.get(ch);//这里读取数据,即便失败了;你的k还有依然自增;
k++;
s+=sizeof(ch);
}
}
fs.close();
cout<<"the size of the file is"<<" "<<s<<"bytes"<<endl;
cout<<k<<ends;
*/
引用:
原帖由 isyf 于 2011-11-29 09:38 发表 2 {8 {# b8 B/ U9 s
第一个问题是我想算出一个文件的字节大小,但是程序运行得到的字节数,总是大于windows系统中的字节数,我不知道是为什么,代码如下(2.doc,只有8个字节,但是用下面代码算出来是9个字节,可以拷贝了在自己环境下运行一下,我的是vs20 ...
8 E% p9 f0 _# t- a) k第一个
复制内容到剪贴板
代码:
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
int k=0;
int s=0;
char ch;
fstream fs("C:\\2.txt");
while(fs)
{
  fs.get(ch);
  if(!fs.eof())
  {
   k++;
   s+=sizeof(ch);
  }
}
fs.close();
cout<<"the size of the file is"<<" "<<s<<"bytes"<<endl;
cout<<k<<ends;
return 0;
}

作者: 月夜幻影   发布时间: 2011-11-29

第二题,你输入q然后按下回车;2 ?# h1 D% X7 b# p9 z- D
刷新输入流,就停止了

作者: 月夜幻影   发布时间: 2011-11-29

[quote]原帖由 月夜幻影 于 2011-11-29 10:25 发表 & U1 b- m4 u# S
/**************************读不出正确的字节数目???*******************************************/
  ], P5 H) @+ K  D/*char ch=0;
$ u3 W& b7 v' Rint k=0;- C' O" |9 ]7 r: [' z2 Q- ?
int s=0;
1 a" L5 ~" a; A) L% jfstream fs("D:\\2.doc",ios_base::in|ios_base:ut|ios_base::app);0 I+ _1 |0 |4 P
if(fs)
1 z* U% c$ d6 D1 _{
" O/ D2 T7 }/ K0 x# V7 D# n0 Mwhil ... [/q]这里的fs.eof(),不就是文件尾部的意思么,只要到了文件尾部就不会再执行循环,fs.get(ch)应该每次都有读入的啊??请楼主给我解释一下,我不太明白

作者: isyf   发布时间: 2011-11-29

拿一个空文档举例(即里面什么字符都没有)
复制内容到剪贴板
代码:
fstream fs("D:\\2.doc",ios_base::in|ios_base:ut|ios_base::app);//这里打开成功
        if(fs)//fs正常,为1
        {
                while(!fs.eof())fs未读取数据,只是判断流;正常,为true;执行
                {
                        fs.get(ch);//没有字符,读取失败,即为eof;
                        k++;//依次执行下面每个语句;
                        s+=sizeof(ch);
                }
        }

作者: 月夜幻影   发布时间: 2011-11-29

其实还是有专门的方法来获取文件大小的
复制内容到剪贴板
代码:
#include <fstream>
#include <stdlib.h>
#include <iostream>
using namespace std;


streamoff get_file_size(const char *file_name)
{
        fstream fin(file_name, ios::in);
        if(!fin)
        {
                cout<<"打开文件失败"<<endl;
                exit(-1);
        }
        fin.seekg(0, ios::end);
        streamoff size = fin.tellg();
        fin.close();
        return size;
}

int main(int argc, char **argv)
{
        cout<<get_file_size("D:\\2.doc")<<endl;
        system("pause");
        return 0;
}

作者: 紫色枫叶   发布时间: 2011-11-29

这里seekg(0,ios_base::end)只是指针的移动啊,size也是指针的计数个数啊,我想求的是字节的大小……

作者: isyf   发布时间: 2011-11-29

呵呵,你可以看看文件的属性啊。而且你忽律了一个事实,比如我们说一个字符的大小用sizeof(char)计算出来就是1,而这个1代表的就是1个字节。移过一个字符就等于移过一个字节。

作者: 紫色枫叶   发布时间: 2011-11-29