0

我将一个整数二进制文件读入 int 向量。当我使用排序函数时,向量正在归零......

我知道矢量没问题!

有什么问题?

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");
4

2 回答 2

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您可以使用算法和 a读取仅包含空格分隔的整数的文本文件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 ) );
于 2012-06-27T20:23:40.057 回答
3

错误在这一行:

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

参数应该是元素的数量,而不是字节数,所以*sizeof(int)从最后取出。实际上,您的向量的元素数量是您想要的 4 倍。你没有读到的都是零,所以当你调用时sort,它们会走到向量的前面,然后你只打印出零,而不是带有真实数据的那些。

于 2012-06-27T20:24:10.627 回答