C ++在写入文件时获取文件的大小

时间:2016-04-13 18:07:14

标签: c++

我有一个录制应用程序,它从网络流中读取数据并将其写入文件。它工作得很好,但我想在写入数据时显示文件大小。每秒gui线程都会更新状态栏以更新显示的录制时间。此时我还想显示当前文件大小。

我最初咨询了this question并尝试了stat方法:

struct stat stat_buf;
int rc = stat(recFilename.c_str(), &stat_buf);
std::cout << recFilename << " " << stat_buf.st_size << "\n";

(没有错误检查以简化)和fseek方法:

FILE *p_file = NULL;
p_file = fopen(recFilename.c_str(),"rb");
fseek(p_file,0,SEEK_END);
int size = ftell(p_file);
fclose(p_file);

但无论如何,我的文件大小为0。当我回去查看我写的文件时,数据就在那里,大小正确。录音发生在一个单独的主题上。

我知道正在写入字节,因为我可以打印数据的大小,因为它与上面显示的方法的输出一起编写。 enter image description here

文件名加0是我从GUI线程打印出来的。 &#39;字节写x&#39;超出录音线程。

3 个答案:

答案 0 :(得分:1)

您可以在此处阅读有关C ++文件操作的所有内容http://www.cplusplus.com/doc/tutorial/files/

这是我如何做的一个例子。

#include <fstream>

std::ifstream::pos_type filesize(const char* file)
{
    std::ifstream in(file, std::ifstream::ate | std::ifstream::binary);
    return in.tellg(); 
}

希望这有帮助。

答案 1 :(得分:0)

作为绝望的替代方案,你可以在&#34;写数据线程中使用ftell&#34;或者可能是一个变量来跟踪写入的数据量,但是要解决真正的问题,你必须犯错,也许fopen永远不会打开文件,或类似的东西。

我会复制一个测试代码,以证明这至少可以在单线程应用中运行

int _tmain(int argc, _TCHAR* argv[]) 
{
    FILE * mFile;
    FILE * mFile2;

    mFile = fopen("hi.txt", "a+");

    // fseek(mFile, 0, SEEK_END);

    // @@ this is to make sure that fputs and fwrite works equal
    // fputs("fopen example", mFile);
    fwrite("fopen ex", 1, 9, mFile);

    fseek(mFile, 0, SEEK_END);
    std::cout << ftell(mFile) << ":";

    mFile2 = fopen("hi.txt", "rb");
        fseek(mFile2, 0, SEEK_END);
        std::cout << ftell(mFile2) << std::endl;
   fclose(mFile2);

   fclose(mFile);

   getchar();

   return 0;
}

答案 2 :(得分:0)

只需在调用stat之前使用freopen函数。似乎freopen刷新了文件长度。