我有以下程序来计算文件大小
#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字节,为什么?怎么了?
答案 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个字节?两者都可能是正确的答案,取决于您使用的结果,