计算文件大小

时间:2010-10-24 17:19:20

标签: c++

我有以下程序来计算文件大小

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){

    string line;
    ifstream myfile ("C:\\Users\\7\\Desktop\\example\\text.txt",ios::in | ios::out |ios::binary);
    if (!myfile){
        cout<<"cannot open file";
         exit (1);

    }

     while (!myfile.eof()){
        getline(myfile,line);
        cout<<line<<endl;

     }

     long l,m;
     l=myfile.tellg();
     myfile.seekg(0,ios::end);
     m=myfile.tellg();
     cout<<"size of  text file is:";
     cout<<(m-l)<<"bytes"<<endl;
     myfile.close();

     return 0;

}

要在text.txt文件中进一步说明,我已经从此网站http://en.wikipedia.org/wiki/List_of_algorithms写了一些信息副本 但它显示我0字节,为什么?怎么了?

7 个答案:

答案 0 :(得分:8)

您要从文件末尾位置(m)减去当前文件位置(l)以获取大小。如果当前文件位置位于文件的开头,这将按预期工作,但由于您刚刚读取了文件的全部内容,(l)在文件末尾“开始”。

只使用(m)的值而不是(m-l),因为文件总是从0开始。

(或者,在使用ftell获取(l)之前,使用fseek移动到文件的开头)

答案 1 :(得分:2)

#include <stdio.h>

int main(int argc, char** argv) {
  FILE *f = fopen("x.txt", "r");
  fseek(f, 0, SEEK_END);
  printf("%ld\n", ftell(f));
  fclose(f);
  return 0;
}

答案 2 :(得分:1)

while (!myfile.eof()){
   getline(myfile,line);
   cout<<line<<endl;
}

读取整个文件,因此get指针已经在文件的末尾。 myfile.seekg(0,ios::end)不会移动它,因此m-l将返回0。

答案 3 :(得分:1)

好的,另一个愚蠢的问题,为什么不使用FileInfo('文件名')并使用存储的长度值?

答案 4 :(得分:0)

看来你的while循环完全读取文件。然后你在l中捕获位置。然后你寻求m,这也是l的位置。然后你打印他们的差异。

我在这里错过了什么吗?

答案 5 :(得分:0)

一旦你读到文件的末尾,它的失败位就会被设置,直到你重置它,你对该文件做的其他任何事情都不会真正实现。您复制文件的循环也是错误的(几乎所有以while (!file.eof())开头的。)

我会尝试这样的事情:

std::string line;
while (getline(myfile, line))
    std::cout << line << "\n";

// allow further use of the stream object to work:
myfile.clear();    

// since we already read to the end, the current position is the length:
length = myfile.tellg();    

答案 6 :(得分:0)

只是警告 - 请注意某些操作系统提供稀疏文件。如果你打开一个文件,写一个字节,寻找文件开头+ 1,000,000,000,写另一个字节,然后关闭文件,中间字节可能实际上不会写入磁盘。那么,文件的大小是多少?实际在磁盘上分配的两个块,或者是最后一个字节的偏移量的1,000,000,000个字节?两者都可能是正确的答案,取决于您使用的结果,