解决 @ nsilent22,谢谢你的建议。只有我所做的更改是在seekg()函数参数中。
ND_file.seekg( (long)(block_number)*DISK_BLOCK_SIZE );
ND_file.read((char*)(&count), sizeof(int));
原帖
我知道早些时候已经提出并回答了类似的问题。仍需要现有计划的帮助。
硬件规格:Ubuntu 14.04,64位,ext4文件系统
我有一个用于创建基于磁盘的索引的旧程序。当索引文件达到2.1GB时,在read()函数之后输入错误的值并且程序中止。
ND_file.seekg(block_number*DISK_BLOCK_SIZE);
ND_file.read((char*)(&count), sizeof(int));
基于类似帖子,我在每个文件的开头放了#define _FILE_OFFSET_BITS 64。
以下是make文件:
GCC=g++ -D_FILE_OFFSET_BITS=64
NDT: main.o utility.o logClass.o
g++ -g -o ndTree main.o utility.o logClass.o
rm *.o
main.o: main.cpp config.h Box_queries.h Meta_entry.h Meta_node.h Dir_entry.h Dir_node.h Leaf_entry.h Leaf_node.h logClass.h ND_tree.h Node.h utility.h
g++ -g -c main.cpp
utility.o: utility.cpp utility.h
g++ -g -c utility.cpp
logClass.o: logClass.cpp logClass.h
g++ -g -c logClass.cpp
clean:
rm -f *.o
@Updated
输出日志的一部分:这里Block-174被调用两次。在第一种情况下,读取功能正确输入磁盘数据。但是,在最后一行中,#Entries是0,这是不对的。当分配块:: 524288时会发生这种情况。因此,我猜read()和seekg()不能正常工作。
Id NewBlockId ParentBlockId #EntriesInBlock Index #MaxEntries
554192 524280 463255 149 61 255
554193 524281 463255 149 75 255
554194 524282 497389 131 80 255
**554195 524283 174 250 26 255**
554196 524284 125426 142 77 255
554197 524285 223509 130 118 255
554198 524286 262212 136 72 255
554199 524287 224407 142 121 255
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check
**554200 524288 174 0 227 255** Aborted (core dumped)
我是否需要使用不同的功能来读取文件内容?任何建议都将不胜感激。
答案 0 :(得分:4)
答案很简单。根据你的评论:
const int DISK_BLOCK_SIZE; unsigned int block_number;
两个变量的类型为int
(一个unsigned
),因此计算出的值为...... int
。
64位Ubuntu系统上int
的大小为...... 32位。在64位系统上编译这个简单的代码:
#include <stdio.h>
int main(void) {
int x = 2000000000;
int y = 4;
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("x * y = %d\n", x * y);
printf("x * y = %ld\n", (long)(x * y));
printf("x * y = %ld\n", (long)(x) * y);
return 0;
}
你会看到你应该做的事情。