【发布时间】:2012-03-24 19:09:04
【问题描述】:
我想将数据从所需字节到以二进制模式打开的文件的另一个所需字节存储到另一个文件中。假设文件指针位于字节#10,现在我想从字节#11到字节#30读取数据。我知道我必须使用fread()函数但不知道如何告诉这个函数从所需位置读取到另一个想要的位置。我是初学者,所以回答这个问题。
我知道 fread() 是 C 函数,我想要 C++ 等效函数来完成这项工作。学习文件处理的书的链接或建议会很棒!
非常感谢您的帮助!
【问题讨论】:
我想将数据从所需字节到以二进制模式打开的文件的另一个所需字节存储到另一个文件中。假设文件指针位于字节#10,现在我想从字节#11到字节#30读取数据。我知道我必须使用fread()函数但不知道如何告诉这个函数从所需位置读取到另一个想要的位置。我是初学者,所以回答这个问题。
我知道 fread() 是 C 函数,我想要 C++ 等效函数来完成这项工作。学习文件处理的书的链接或建议会很棒!
非常感谢您的帮助!
【问题讨论】:
你必须寻找:
std::ifstream infile("source.bin", std::ios::binary);
infile.seekg(10, std::ios::beg); // seek to 10 bytes from the beginning
char buf[20];
if (!infile.read(buf, 20)) { /* error */ }
// now your data is in buf
stdio 接口是类似的,但由于这是 C++,我们更喜欢 iostreams 接口。绝对不能在不检查返回值的情况下使用 I/O 操作,在 iostreams 中这相当容易。对于fread,您必须小心正确解释返回值。
【讨论】:
嗯,fread 的原型是:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
而 fseek 是:
int fseek ( FILE * stream, long int offset, int origin );
如果你想得到字节#11,你可以这样做:
fseek(file, 11, SEEK_SET) // this means: go 11 bytes from the start position.
或者,由于您已经在第 10 个字节,您可以这样做:
fseek(file, 1, SEEK_CUR) // this means: go 1 byte beyond current position.
然后,要从字节 11 读取最多字节 30,您需要读取 19 个字节 (30 - 11),因此您可以这样做:
fread(buffer, sizeof(char), 19, file).
【讨论】:
fread 而不检查它的返回值是一个编程错误。