2012-06-27 100 views
0

我读整型二进制文件为int矢量。当我使用排序功能的矢量是零...在C++中排序矢量

我知道矢量是好的!

什么可能是错的?

std::ifstream input("D:\\Amostra.txt", ios::binary); 
vector<int> v (NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int)); 

input.read(reinterpret_cast<char *>(&v[0]), NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int)); 


sort(v.begin(), v.end()); 

for (int i=0; i<ELEMENTS_PER_BLOCK*NumBlocks; i++){ 
     cout << v[i] << endl; 
    }; 
system("pause"); 
+2

您正在将'int'转换为'char *'。我不认为这真的应该工作?我确定你不想'char'来代替? –

+0

请检查'NumBlocks'的值 – Chani

回答

12
vector<int> v (NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int)); 

的参数传递给构造器是你需要的元素的数量,而不是那些要素采取的字节数。这将创建sizeof(int)*N元素,其中N是您需要的数字。排序第一(sizeof(int)-1)*N后为0。

input.read(reinterpret_cast<char *>(&v[0]), NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int)); 

该文件具有.txt扩展,但你在读它,仿佛它是二进制文件。如果该文件是二进制转储文件,那么这个读取就是...呃...代码气味,但并不完全错误。如果文件是文本,那么这是完全错误的。

您可以读取包含使用copy算法只空格隔开的整数文本文件和istream_iterator

std::vector<int> v; 
v.reserve(NumBlocks*ELEMENTS_PER_BLOCK); 
std::copy(std::istream_iterator<int>(input), std::istream_iterator<int>(), 
      std::back_inserter(v)); 
+0

我的坏话!你完全正确! –

3

在此行中的错误的:

vector<int> v (NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int)); 

的说法应该是多少的元素,而不是字节数,所以从最后拿出*sizeof(int)。就像这样,你的矢量的元素数量是你想要的数量的4倍。你没有读到的那些都是零,所以当你打电话给sort时,他们会走到矢量的前面,然后你只打印出零数字,而不是真正的数据。