我有一个录制应用程序,它从网络流中读取数据并将其写入文件。它工作得很好,但我想在写入数据时显示文件大小。每秒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。当我回去查看我写的文件时,数据就在那里,大小正确。录音发生在一个单独的主题上。
我知道正在写入字节,因为我可以打印数据的大小,因为它与上面显示的方法的输出一起编写。
文件名加0是我从GUI线程打印出来的。 &#39;字节写x&#39;超出录音线程。
答案 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刷新了文件长度。