Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用C++;_C++_Stl - Fatal编程技术网

C++ 用C++;

C++ 用C++;,c++,stl,C++,Stl,为了模拟我的网络,我使用了一个大小在5到30 GB之间的跟踪文件(csv文件)。 csv文件是一个基于行的文件,其中每行包含多个由空格分隔的字段,这些字段构成形成网络数据包的信息: 3 53 4 12 1 1 2 6 由于文件的大小可能达到几GB(数百万行),因此最好将其分成小块myfile00.csv、myfile01.csv……还是我可以在硬盘上处理整个文件而不加载到内存中? 我想在特定时间逐行读取文件,这是模拟的时钟周期,并获取行中的所有信息以创

为了模拟我的网络,我使用了一个大小在5到30 GB之间的跟踪文件(csv文件)。 csv文件是一个基于行的文件,其中每行包含多个由空格分隔的字段,这些字段构成形成网络数据包的信息:

3     53      4    12    1     1  2  6
由于文件的大小可能达到几GB(数百万行),因此最好将其分成小块myfile00.csv、myfile01.csv……还是我可以在硬盘上处理整个文件而不加载到内存中? 我想在特定时间逐行读取文件,这是模拟的时钟周期,并获取行中的所有信息以创建omnet++消息

packet MyTrace::getpacket() {
int id; // first field
int cycle; // second field
int source; // third field
int destination; // fourth field
int numberofDep; // fifth field
std::list<int> listofDep; // remaining fields

if (!traceFile.is_open()) {
 // get id
 // get cycle
 // ....
}
packetmytrace::getpacket(){
int id;//第一个字段
int cycle;//第二个字段
int source;//第三个字段
int destination;//第四个字段
int numberofDep;//第五个字段
std::list listofDep;//剩余字段
如果(!traceFile.is_open()){
//取得身份证
//获取周期
// ....
}
任何建议都会有帮助

编辑:

字符串行;
ifstream myfile(“BlackSmall.csv”);
int currentline=0;
如果(myfile.is_open())
{
while(getline(myfile,line)){
istringstream ss(线);
字符串请求;
int id、cycle、source、dest、srcType、destType、packetSize、dependency;
int listdep;
std::列表dep;
ss>>id;
ss>>循环;
ss>>来源;
ss>>目的地;
ss>>请求;
ss>>src类型;
ss>>类型;
ss>>包装尺寸;
依赖性;
while(ss>>listdep)dep.push_back(listdep);
//创建我的包
}
myfile.close();
}

否则,最好的方法可能是将CSV文件导入SQLite数据库


导入它并添加一些索引后,您可以轻松高效地从该数据库中查询必要的行。SQLite有许多现成的C/C++客户端库,您可以从开始使用默认库。

也许将CSV文件导入SQLite数据库是最好的方法


导入它并添加一些索引后,您可以轻松高效地从该数据库中查询必要的行。SQLite有许多现成的C/C++客户机库,您可以从开始使用默认库。

您的应用程序似乎需要对输入进行单次顺序传递,因此处理一个1GB或100GB可能只是耐心和并行性的问题

方法应该是逐行翻译记录。应该避免尝试将整个文件读入内存的策略。STL提供了易于使用的std::ifstream类,带有内置的getline方法,该方法返回包含要转换的行的std::string

如果您有更大的雄心壮志,并且希望更仔细地控制读取或缓冲的数据量,那么您不会是第一个使用自己的代码来实现缓冲读取器的开发人员。这是一个相当有能力的练习,可以帮助您思考一些阅读部分行之类的特殊情况。但最终,它可能不会给您的目标带来显著的提升。我怀疑ifstream方法可以让您轻松启动并运行,并且最终不会成为处理这些文件的瓶颈

如果您真正关心优化执行时间,那么拥有多个文件可能有助于启动并行处理任务

// define a class to hold your custom record
class Record {
};

// create a parser function to convert a line of text into the record
bool parse(std::string const &line, Record &record) {
}

// create a translator method to convert a record into the desired output
bool write(Record const &record, std::ofstream &os) {
}

// actually open input stream for the input file
std::ifstream is;
std::ofstream os;
std::string line;

while (std::getline(is,line)) {
  Record record;
  if (!parse(line,record)) break;
  if (!write(record,os)) break;
}

你可以通过将记录实例在while循环之外移动来使用,只要你小心地重置变量,这样来自前面记录的信息不会污染当前记录。你也可以通过产生流输入和输出操作符(“”)来首先跳入C++生态系统。但我个人认为这种方法比它的价值更令人困惑。

您的应用程序似乎需要对输入进行单次顺序传递,因此处理1GB或100GB的文件可能只是耐心和并行性的问题

方法应该是逐行翻译记录。应该避免尝试将整个文件读入内存的策略。STL提供了易于使用的std::ifstream类,带有内置的getline方法,该方法返回包含要转换的行的std::string

如果您有更大的雄心壮志,并且希望更仔细地控制读取或缓冲的数据量,那么您不会是第一个使用自己的代码来实现缓冲读取器的开发人员。这是一个相当有能力的练习,可以帮助您思考一些阅读部分行之类的特殊情况。但最终,它可能不会给您的目标带来显著的提升。我怀疑ifstream方法可以让您轻松启动并运行,并且最终不会成为处理这些文件的瓶颈

如果您真正关心优化执行时间,那么拥有多个文件可能有助于启动并行处理任务

// define a class to hold your custom record
class Record {
};

// create a parser function to convert a line of text into the record
bool parse(std::string const &line, Record &record) {
}

// create a translator method to convert a record into the desired output
bool write(Record const &record, std::ofstream &os) {
}

// actually open input stream for the input file
std::ifstream is;
std::ofstream os;
std::string line;

while (std::getline(is,line)) {
  Record record;
  if (!parse(line,record)) break;
  if (!write(record,os)) break;
}

你可以通过将记录实例在while循环之外移动来使用,只要你小心地重置变量,这样来自前面记录的信息不会污染当前记录。你也可以通过产生流输入和输出操作符(“”)来首先跳入C++生态系统。但我个人觉得这种方法比它的价值更令人困惑。

我不认为你的问题是针对OMNeT++的。如果你更笼统地表达它,你可能会找到更好的帮助。谢谢Christoph,我编辑了标签,并使问题更笼统。希望我能得到帮助!我不认为你的问题是针对OMNeT++的。如果如果你的措辞更笼统,你可能会找到更好的帮助。谢谢Christoph,我编辑了标签,让问题更笼统。希望我能得到帮助