让我们为这个问题创建一个补充问题.在C++中获取文件大小的最常用方法是什么?在回答之前,确保它是可移植的(可以在Unix,Mac和Windows上执行),可靠,易于理解且没有库依赖(没有boost或qt,但是例如glib是可以的,因为它是可移植的库).
我正在使用TCP将文件从客户端发送到服务器.为了标记文件的结尾,我想在实际数据之前发送文件大小.所以我使用stat系统调用来查找文件的大小.这是类型off_t.我想知道它占用了多少字节,以便我可以在服务器端正确读取它.它定义于 <sys/types.h>.但我不明白这个定义.它只是定义__off_t or _off64_t为off_t.在哪里寻找__off_t?它__也是为头文件中的大部分内容添加前缀的约定,当我读取头文件以更好地理解时会让我感到害怕.如何更好地阅读头文件?
#ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
#endif
Run Code Online (Sandbox Code Playgroud) 我做了一个示例项目,将文件读入缓冲区.当我使用tellg()函数时,它给我一个比读取函数实际读取的值更大的值.我认为有一个错误.
这是我的代码:
编辑:
void read_file (const char* name, int *size , char*& buffer)
{
ifstream file;
file.open(name,ios::in|ios::binary);
*size = 0;
if (file.is_open())
{
// get length of file
file.seekg(0,std::ios_base::end);
int length = *size = file.tellg();
file.seekg(0,std::ios_base::beg);
// allocate buffer in size of file
buffer = new char[length];
// read
file.read(buffer,length);
cout << file.gcount() << endl;
}
file.close();
}
Run Code Online (Sandbox Code Playgroud)
主要:
void main()
{
int size = 0;
char* buffer = NULL;
read_file("File.txt",&size,buffer);
for (int i = 0; i < size; i++) …Run Code Online (Sandbox Code Playgroud) 我有一个类型的文件流ofstream.构造函数以追加模式打开文件,所有消息总是写在文件末尾.
我需要写入一些固定大小的输出文件,例如1Mb,然后我需要关闭,重命名和压缩它,然后打开一个同名的新文件.
这需要在达到特定大小的文件时完成.
我尝试使用tellg()但是在网上阅读了东西(和这个)后,我明白这不是正确的方法.
由于我是C++的新手,我正在尝试找出最优化和正确的方法来获得准确的文件当前大小ofstream?
class Logger {
std::ofstream outputFile;
int curr_size;
Logger (const std::string logfile) : outputFile(FILENAME,
std::ios::app)
{
curr_size = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
在程序的某个地方,我正在写入数据:
// ??? Determine the size of current file ???
if (curr_size >= MAX_FILE_SIZE) {
outputFile.close();
//Code to rename and compress file
// ...
outputFile.open(FILENAME, std::ios::app);
curr_size = 0;
}
outputFile << message << std::endl;
outputFile.flush();
Run Code Online (Sandbox Code Playgroud) 为什么这会失败,它应该是简单而有效的?
fisier.seekg(0, ios::end);
long lungime = fisier.tellg();
Run Code Online (Sandbox Code Playgroud)
这将返回一个比文件更大的值,从而导致错误
char *continut = new char[lungime];
Run Code Online (Sandbox Code Playgroud)
知道问题可能是什么?
我也尝试一次计数到文件的末尾一个char,它产生相同的结果,比预期的数字更高.但是一旦使用getline()一次读取一行,它就可以工作,没有多余的空格......