//
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <string>
#include <ctype.h>
#include <time.h>
#include <process.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
struct nameval
{
char fld_nm[100];
wchar_t fld_nm_t[100];
int fld_len;
int fld_val;
};
nameval binrec;
bool LessComp(const nameval& a1, const nameval& a2)
{
if(strcmp(a1.fld_nm, a2.fld_nm) < 0) return true;
if(strcmp(a1.fld_nm, a2.fld_nm) > 0) return false;
if(a1.fld_val < a2.fld_val) return true;
return false;
}
int main()
{
std::vector<nameval> records;
int cnt;
for (cnt=0;cnt<3000000;cnt++)
{
nameval val={0};
int j;
for (j=0;j<20;j++)
{
val.fld_nm[j] += (char)(rand () % 58 + 64);
}
wchar_t wbuf[100]={0};
mbstowcs(wbuf,val.fld_nm,_countof(val.fld_nm));
wmemcpy(val.fld_nm_t,wbuf,100);
val.fld_val=cnt;
records.push_back(val);
}
std::sort(records.begin(), records.end(), LessComp);
std::ofstream ostrm("c:\\dp4\\flout.bin", std::ios::binary | std::ios::out );
if (ostrm.is_open())
{
for (size_t i = 0; i < records.size(); i++)
{
ostrm.write((char *)&records[i], sizeof(nameval));
}
}
std::wofstream ostrm2("c:\\dp4\\flout.ord", std::ios::out );
if (ostrm2.is_open())
{
for (size_t i = 0; i < records.size(); i++)
{
ostrm2 << "\"" << records[i].fld_nm << "\" " << records[i].fld_len << ' ' << records[i].fld_nm_t << ' '<< records[i].fld_val << '\n';
}
}
return 0;
}
and here is the image records.reserve(8000000);
for (cnt=0;cnt<8000000;cnt++)
...
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <string>
#include <ctype.h>
#include <time.h>
#include <process.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
struct nameval
{
char fld_nm[100];
wchar_t fld_nm_t[100];
int fld_len;
int fld_val;
};
nameval binrec;
bool LessComp(const nameval& a1, const nameval& a2)
{
if(strcmp(a1.fld_nm, a2.fld_nm) < 0) return true;
if(strcmp(a1.fld_nm, a2.fld_nm) > 0) return false;
if(a1.fld_val < a2.fld_val) return true;
return false;
}
int main()
{
std::vector<nameval> records;
std::cout << "max_size: " << records.max_size() << "\n";
return 0;
}
Why do you want to create and handle IN MEMORY over 8 Million randomly generated strings?You addressed other questions from him but did not address this one. The question does appear to be either homework or self-study, so I have limited my answers.
 Is this homework? An exercise? for a reason?
Why do you want to create and handle IN MEMORY over 8 Million randomly generated strings?You addressed other questions from him but did not address this one.
 Is this homework? An exercise? for a reason?
How to resolve the real problem, to handle 8 millions records by the program?there are a few options:
struct nameval
{
....
bool operator< (const nameval & a2) const;
};
1>------ Rebuild All started: Project: SaveBinaryFile, Configuration: Debug Win32 ------
1> stdafx.cpp
1> SaveBinaryFile.cpp
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(44): error C2039: 'set' : is not a member of 'std'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(44): error C2065: 'set' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(44): error C2275: 'nameval' : illegal use of this type as an expression
1> c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(21) : see declaration of 'nameval'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(44): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(46): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(46): error C2228: left of '.reserve' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(72): error C3083: 'set': the symbol to the left of a '::' must be a type
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(72): error C2039: 'insert' : is not a member of 'std'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(72): error C3861: 'insert': identifier not found
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(74): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(74): error C2228: left of '.begin' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(74): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(74): error C2228: left of '.end' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(74): error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(3639) : see declaration of 'std::sort'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(79): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(79): error C2228: left of '.size' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(84): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(94): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(94): error C2228: left of '.size' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2228: left of '.fld_nm' must have class/struct/union
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2228: left of '.fld_len' must have class/struct/union
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2228: left of '.fld_nm_t' must have class/struct/union
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(97): error C2228: left of '.fld_val' must have class/struct/union
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
//
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <string>
#include <ctype.h>
#include <time.h>
#include <process.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
struct nameval
{
bool operator< (const nameval & a2) const;
char fld_nm[100];
wchar_t fld_nm_t[100];
int fld_len;
int fld_val;
};
nameval binrec;
bool LessComp(const nameval& a1, const nameval& a2)
{
if(strcmp(a1.fld_nm, a2.fld_nm) < 0) return true;
if(strcmp(a1.fld_nm, a2.fld_nm) > 0) return false;
if(a1.fld_val < a2.fld_val) return true;
return false;
}
int main()
{
std::set<nameval> records;
int cnt;
records.reserve(8000000);
for (cnt=0;cnt<8000000;cnt++)
{
nameval val={0};
int j;
for (j=0;j<20;j++)
{
val.fld_nm[j] += (char)(rand () % 58 + 64);
}
wchar_t wbuf[100]={0};
mbstowcs(wbuf,val.fld_nm,_countof(val.fld_nm));
wmemcpy(val.fld_nm_t,wbuf,100);
val.fld_val=cnt;
std::set::insert(val);
}
std::sort(records.begin(), records.end(), LessComp);
std::ofstream ostrm("c:\\dp4\\flout.bin", std::ios::binary | std::ios::out );
if (ostrm.is_open())
{
for (size_t i = 0; i < records.size(); i++)
{
ostrm.write((char *)&records[i], sizeof(nameval));
}
}
std::wofstream ostrm2("c:\\dp4\\flout.ord", std::ios::out );
if (ostrm2.is_open())
{
for (size_t i = 0; i < records.size(); i++)
{
ostrm2 << "\"" << records[i].fld_nm << "\" " << records[i].fld_len << ' ' << records[i].fld_nm_t << ' '<< records[i].fld_val << '\0' << '\n';
}
}
return 0;
}
#include <set>
//forward declaration
bool LessComp(const nameval & a1, const nameval & a2);
struct nameval
{
....
bool operator< (const nameval & a2) const
{
return LessComp(*this, a2);
}
records.insert(val);
for (std::set<namval>::iterator it = records.begin(); it != records.end(); ++it)
1>------ Rebuild All started: Project: SaveBinaryFile, Configuration: Debug Win32 ------
1> stdafx.cpp
1> SaveBinaryFile.cpp
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(3): warning C4627: '#include <set>': skipped when looking for precompiled header use
1> Add directive to 'StdAfx.h' or rebuild precompiled header
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(29): error C3861: 'LessComp': identifier not found
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(48): error C2039: 'set' : is not a member of 'std'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(48): error C2065: 'set' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(48): error C2275: 'nameval' : illegal use of this type as an expression
1> c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(22) : see declaration of 'nameval'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(48): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(76): error C3083: 'set': the symbol to the left of a '::' must be a type
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(76): error C2039: 'insert' : is not a member of 'std'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(76): error C3861: 'insert': identifier not found
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(78): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(78): error C2228: left of '.begin' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(78): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(78): error C2228: left of '.end' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(78): error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(3639) : see declaration of 'std::sort'
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(83): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(83): error C2228: left of '.size' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(88): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(98): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(98): error C2228: left of '.size' must have class/struct/union
1> type is ''unknown-type''
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2228: left of '.fld_nm' must have class/struct/union
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2228: left of '.fld_len' must have class/struct/union
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2228: left of '.fld_nm_t' must have class/struct/union
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2065: 'records' : undeclared identifier
1>c:\savebinaryfile\savebinaryfile\savebinaryfile.cpp(101): error C2228: left of '.fld_val' must have class/struct/union
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
//
#include <set>
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <string>
#include <ctype.h>
#include <time.h>
#include <process.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
bool LessComp(const nameval& a1, const nameval& a2)
{
if(strcmp(a1.fld_nm, a2.fld_nm) < 0) return true;
if(strcmp(a1.fld_nm, a2.fld_nm) > 0) return false;
if(a1.fld_val < a2.fld_val) return true;
return false;
}
struct nameval
{
char fld_nm[100];
wchar_t fld_nm_t[100];
bool operator< (const nameval & a2) const
{
return LessComp(*this, a2);
}
int fld_len;
int fld_val;
};
nameval binrec;
int main()
{
std::set<nameval> records;
int cnt;
for (cnt=0;cnt<8000000;cnt++)
{
nameval val={0};
int j;
for (j=0;j<20;j++)
{
val.fld_nm[j] += (char)(rand () % 58 + 64);
}
wchar_t wbuf[100]={0};
mbstowcs(wbuf,val.fld_nm,_countof(val.fld_nm));
wmemcpy(val.fld_nm_t,wbuf,100);
val.fld_val=cnt;
std::set::insert(val);
}
std::sort(records.begin(), records.end(), LessComp);
std::ofstream ostrm("c:\\dp4\\flout.bin", std::ios::binary | std::ios::out );
if (ostrm.is_open())
{
for (size_t i = 0; i < records.size(); i++)
{
ostrm.write((char *)&records[i], sizeof(nameval));
}
}
std::wofstream ostrm2("c:\\dp4\\flout.ord", std::ios::out );
if (ostrm2.is_open())
{
for (size_t i = 0; i < records.size(); i++)
{
ostrm2 << "\"" << records[i].fld_nm << "\" " << records[i].fld_len << ' ' << records[i].fld_nm_t << ' '<< records[i].fld_val << '\0' << '\n';
}
}
return 0;
}
#include <set>': skipped when looking for precompiled header useyou need to add the #include <set> below #include stdafx.h.
std::set::insert(val);the statement is wrong. see my previous comment.
std::sort(records.begin(),as told, the statement must be removed.records.end(), LessComp);
std::set::insert(val);
...
Phoffric,how to correct this line?
records.insert(val);
1>c:\savebinaryfile tst\savebinaryfile\savebinaryfile.cpp(84): error C2065: 'namval' : undeclared identifier
1>c:\savebinaryfile tst\savebinaryfile\savebinaryfile.cpp(84): error C2955: 'std::set' : use of class template requires template argument list
for (std::set<namval>::iterator it = records.begin(); it != records.end(); ++it)
...
for (std::set<nameval>::iterator it = records.begin(); it != records.end(); ++it)
{
ostrm2 << "\"" << records[i].fld_nm << "\" " << records[i].fld_len << ' ' << records[i].fld_nm_uni << ' '<< records[i].fld_val << '\0' << '\n';
...
bool LessComp(const nameval& a1, const nameval& a2)
{
if(strcmp(a1.fld_nm, a2.fld_nm) < 0) return true;
if(strcmp(a1.fld_nm, a2.fld_nm) > 0) return false;
if(a1.fld_val < a2.fld_val) return true;
return false;
}