在Ubuntu 64位操作系统中无法读取大于2GB的文件

时间:2015-07-23 20:00:09

标签: c++ linux ubuntu limit

解决 @ 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)

我是否需要使用不同的功能来读取文件内容?任何建议都将不胜感激。

1 个答案:

答案 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;
}

你会看到你应该做的事情。