你好我是c ++的新用户,我有一个问题 我想将文本文件读入矢量。这个文件有57 000行,我遇到了这个问题
项目2.exe中0x764d4dbd处的未处理异常:Microsoft C ++异常:内存位置为0x007ceb48的std :: bad_alloc ..
这是我的编码
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cmath>
#include <vector>
#include <string>
#include <malloc.h>
using namespace std;
const int m = 17000;
const int n = 2;
std::vector< vector<long double> > student (m, vector<long double>(m,n));
ifstream inpStud("Carleton91.stu");
ofstream outData ("output.txt");
void readstudent(){
long double k, numline;
//assign all data to an array
for (int i= 0; i<m; i++)
{
for (int j= 0; j<n; j++)
{
inpStud >> student[i][j];
k=student[i][j];
}
//count number of exam
if ((k==2) && (i>100)){
numline = i;
break;
}
}
//print data
for (int i= 0; i<numline; i++)
{
for (int j= 0; j<n; j++)
{
outData << student[i][j] << " ";
}
outData << endl;
}
}
int main()
{
readstudent();
inpStud.close();
outData.close();
return 0;
我知道实际问题是什么...请有人帮助我...谢谢
答案 0 :(得分:1)
const int m = 17000;
const int n = 2;
std::vector< vector<long double> > student (m, vector<long double>(m,n));
这会创建一个vector
个vector<long double>
个包含17000个向量,每个向量依次包含17000个long double
个,每个向量初始化为2个。
long double
每个通常至少8个字节,具体取决于系统。我们现在采取下限。忽略vector
的所有开销,您将分配空间来存储17000 * 17000 = 2.89亿long double
个值;假设每long double
个8字节,即23.12亿字节,或大约2.15GB。
Windows上32位程序的用户模式地址空间通常为2GB(32位指针只能处理4GB,其中一半用于操作系统使用),这意味着该程序不能可能会分配所有内存。其中一个分配失败,抛出std::bad_alloc
异常,导致您得到错误。
答案 1 :(得分:1)
假设您要做的是为每个学生存储多个值,那么更好的选择是使用std::map<int, std::vector<int>>
。这样,您就可以将一名学生映射到与学生相关的所有数据的向量。
由于数据似乎只是一个int,因此vector<int>
是地图中需要表示的所有数据项。
以下代码与您的文件一起使用没有问题(如果文件URL链接断开,文件由两个整数的行组成 - 第一个是学号,第二个整数是课程号):
#include <vector>
#include <map>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
typedef std::map<int, std::vector<int>> MapIntToVector;
using namespace std;
int main()
{
MapIntToVector m_mapIntVect;
ifstream ifs("Carleton91.stu");
int studentNumber, studentCourse;
while (ifs)
{
ifs >> studentNumber >> studentCourse;
m_mapIntVect[studentNumber].push_back(studentCourse);
}
// output data
MapIntToVector::iterator it = m_mapIntVect.begin();
while (it != m_mapVect.end())
{
cout << "Here is student " << it->first << " course(s) taken: ";
std::copy(it->second.begin(), it->second.end(), ostream_iterator<int>(cout, " "));
cout << "\n";
++it;
}
}
输入和输出从文件中读入的学生。
只要遇到新的学号,输入部分就会在地图中创建一个新条目。无论学生条目是否为新条目,数据项都会被推送到与学生相关的向量上。
我留给你研究std::map
等容器。