OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
checksum_output_files.cpp
Go to the documentation of this file.
1//Copyright> OpenRadioss
2//Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3//Copyright>
4//Copyright> This program is free software: you can redistribute it and/or modify
5//Copyright> it under the terms of the GNU Affero General Public License as published by
6//Copyright> the Free Software Foundation, either version 3 of the License, or
7//Copyright> (at your option) any later version.
8//Copyright>
9//Copyright> This program is distributed in the hope that it will be useful,
10//Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11//Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12//Copyright> GNU Affero General Public License for more details.
13//Copyright>
14//Copyright> You should have received a copy of the GNU Affero General Public License
15//Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16//Copyright>
17//Copyright>
18//Copyright> Commercial Alternative: Altair Radioss Software
19//Copyright>
20//Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21//Copyright> software under a commercial license. Contact Altair to discuss further if the
22//Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23
25 // -----------------------------------------------------------------------------------
26 // Dos2Unix : function to remove (cr) characters from a string
27 // -----------------------------------------------------------------------------------
28 void CheckSum_Output_Files::remove_cr(std::string& line) {
29
30 line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());
31 }
32
33 // -----------------------------------------------------------------------------------
34 // Remove trailing blanks from a string
35 // -----------------------------------------------------------------------------------
37 str.erase(std::find_if(str.rbegin(), str.rend(), [](unsigned char ch) {
38 return !std::isspace(ch);
39 }).base(), str.end());
40 }
41
42 inline void CheckSum_Output_Files::SWAP_MANY2BYTES(uint16_t *intPtr, size_t number){
43 for (size_t ptrIndex = 0; ptrIndex < (number); ptrIndex++){
44 intPtr[ptrIndex] = htons((intPtr[ptrIndex]));
45 }
46 }
47
48 inline void CheckSum_Output_Files::SWAP_MANY4BYTES(int *intPtr, size_t number){
49 for (size_t ptrIndex = 0; ptrIndex < (number); ptrIndex++){
50 intPtr[ptrIndex] = ntohl((intPtr[ptrIndex]));
51 }
52 }
53
54 inline void CheckSum_Output_Files::SWAP_MANY8BYTES(double *intPtr, size_t number){
55 for (size_t ptrIndex = 0; ptrIndex < (number); ptrIndex++){
56 intPtr[ptrIndex] = htobe64(intPtr[ptrIndex]);
57 }
58 }
59
60 inline void CheckSum_Output_Files::SWAP_BYTESINDATA(void *itemList, size_t itemCount, size_t sizeOfItem){
61 uint16_t *uint16_tCopy;
62 int *intCopy;
63 double *doubleCopy;
64 switch ((sizeOfItem)){
65 case 1:
66 break;
67 case 2:
68 uint16_tCopy = (uint16_t *)(itemList);
69 SWAP_MANY2BYTES(uint16_tCopy, (itemCount));
70 break;
71 case 4:
72 intCopy = (int *)(itemList);
73 SWAP_MANY4BYTES(intCopy, (itemCount));
74 break;
75 case 8:
76 doubleCopy = (double *)(itemList);
77 SWAP_MANY8BYTES(doubleCopy, (itemCount));
78 break;
79 }
80 }
81
82 // open Animation or TH file
83 // ------------------------------------------
84 // Open the file in binary mode
85 // Mode: "std" standard read, "gz" gzip read
86 // -----------------------------------------
87 int CheckSum_Output_Files::open_binary_file(std::string filename){
88 int success=0;
89 std::string extention=filename.substr(filename.find_last_of(".") + 1);
90
91 if (extention == "gz"){
92 // Open gzipped file
93 file_mode="gz";
94 gzstream = gzopen(filename.c_str(), "rb");
95 if (gzstream == NULL){
96 success=0;
97 }else{
98 success=1;
99 }
100 }
101 else{
102 // Open standard file
103 file_mode="std";
104
105#ifdef _WIN64
106 fopen_s(&fstream, filename.c_str(), "rb");
107#else
108 fstream = fopen((const char*)filename.c_str(), "rb");
109#endif
110 if (fstream == NULL){
111 success=0;
112 }else{
113 success=1;
114 }
115 }
116 return success;
117 }
118
119
121 if (file_mode == "gz"){
122 gzclose(gzstream);
123 }else{
124 fclose(fstream);
125 }
126
127 }
128
129 // read in file
130 // ----------------------
131 int CheckSum_Output_Files::Ufread(void *pchar, size_t sizeOfItem,
132 size_t numItems,
133 bool text ){
134
135 int ret;
136 if (file_mode == "gz"){
137 ret = gzfread(pchar, sizeOfItem , numItems, gzstream);
138 if (ret < 0){
139 cout << "Error in reading file" << endl;
140 }
141 }else{
142 ret = fread(pchar, sizeOfItem, numItems, fstream);
143 if (ret < 0){
144 cout << "Error in reading file" << endl;
145
146 }
147 }
148 SWAP_BYTESINDATA(pchar, numItems, sizeOfItem);
149 if (text)
150 ((char *)pchar)[sizeOfItem * numItems] = '\0';
151 return ret;
152 }
153
154// Read Animation file & retrieve checksums
155// --------------------------------------------------
156std::list<std::string> CheckSum_Output_Files::Animation()
157{
158 typedef unsigned char Boolean;
159
160 int magic; // object format
161 int flagA[10]; // array of flags
162 float a_time; // state time
163
164 // 3D GEOMETRY
165 int nbElts3D = 0; // number of 8nodes elements
166 int nbParts3D = 0; // number of parts
167 int nbEFunc3D = 0; // number of element scalar values
168 int nbTens3D = 0; // number of tensors
169 int *connect3DA = nullptr; // connectivity array of 8 nbElts3D
170 Boolean *delElt3DA = nullptr; // are the elements deleted or not, array of nbElts3D
171 int *defPart3DA = nullptr; // part definition: array of nbParts3D
172 char **pText3DA = nullptr; // part name: array of nbParts3D
173 char **fText3DA = nullptr; // array of scalar name: nbEFunc3D
174 float *eFunc3DA = nullptr; // scalar value per element array of nbEFunc3D*nbElts3D
175 char **tText3DA = nullptr; // tensor name array of nbTens3D
176 float *tensVal3DA = nullptr; // tens value array of 6*nbTens3D*nbElt3D
177 float *eMass3DA = nullptr; // nbElt3D, elt mass
178 int *elNum3DA = nullptr; // nbElt3D, intern elt numbering
179
180 // 2D GEOMETRY
181 int nbFacets = 0; // number of 4nodes elements
182 int nbNodes = 0; // total number of nodes
183 int nbParts = 0; // number of parts
184 int nbFunc = 0; // number of nodal scalar values
185 int nbEFunc = 0; // number of element scalar values
186 int nbVect = 0; // number of vectors
187 int nbTens = 0; // number of tensors
188 int nbSkew = 0; // number of skews
189 uint16_t *skewShortValA = nullptr; // array of the skew values defined in uint16_t * 3000 ;
190 float *skewValA = nullptr; // array of the skew values for each elt
191 float *coorA = nullptr; // coordinates array of 3*nbNodes
192 int *connectA = nullptr; // connectivity array of 4 * nbFacets
193 char *delEltA = nullptr; // are the elements deleted or not, array of nbFacets
194 int *defPartA = nullptr; // part definition: array of nbParts
195 uint16_t *normShortA = nullptr; // facet normal in uint16_t : array of 3*nbNodes
196 float *funcA = nullptr; // scalar value per node array of nbFunc*nbNodes
197 float *eFuncA = nullptr; // scalar value per element array of nbEFunc*nbFacets
198
199 char tmpText[128];
200 int i;
201 FILE *inf=NULL;
202
203 std::list<std::string> checksum_list;
204
205 // read Animation file
206 Ufread(&magic, sizeof(int), 1);
207
208 switch (magic){
209 case FASTMAGI10:
210 {
211 Ufread(&a_time, sizeof(float), 1); // time of the file
212 Ufread(tmpText, sizeof(char), 81); // Time text
213 Ufread(tmpText, sizeof(char), 81); // ModAnim text
214 Ufread(tmpText, sizeof(char), 81); // RadiossRun text
215 // array of 10 flags
216 // flagA[0] defines if theflagA mass is saved or not
217 // flagA[1] defines if the node-element numbering arrays are saved or not
218 // flagA[2] defines format :if there is 3D geometry
219 // flagA[3] defines format :if there is 1D geometry
220 // flagA[4] defines hierarchy
221 // flagA[5] defines node/elt list for TH
222 // flagA[6] defines if there is a new skew for tensor 2D
223 // flagA[7] define if there is SPH format
224 // flagA[8] to flagsA[9] are not yet used
225
226 Ufread(flagA, sizeof(int), 10);
227 // ********************
228 // 2D GEOMETRY
229 // ********************
230 Ufread(&nbNodes, sizeof(int), 1); // number of nodes
231 Ufread(&nbFacets, sizeof(int), 1); // number of 4nodes elements
232 Ufread(&nbParts, sizeof(int), 1); // number of parts
233 Ufread(&nbFunc, sizeof(int), 1); // number of nodal scalar values
234 Ufread(&nbEFunc, sizeof(int), 1); // number of elemt scalar values
235 Ufread(&nbVect, sizeof(int), 1); // number of vector values
236 Ufread(&nbTens, sizeof(int), 1); // number of tensor values
237 Ufread(&nbSkew, sizeof(int), 1); // number of skews array of the skew values defined in uint16_t * 3000
238
239 if (nbSkew)
240 {
241 skewShortValA = (uint16_t *)malloc(nbSkew * 6 * sizeof(uint16_t));
242 skewValA = (float *)malloc(nbSkew * 6 * sizeof(float));
243 Ufread(skewShortValA, sizeof(uint16_t), nbSkew * 6);
244 for (i = 0; i < 6 * nbSkew; i++)
245 {
246 skewValA[i] = ((float)skewShortValA[i]) /
248 }
249 }
250
251 // coordinates array: containing the x,y,z coordinates of each node
252 coorA = (float *)malloc(3 * nbNodes * sizeof(float));
253 Ufread(coorA, sizeof(float), 3 * nbNodes);
254 free(coorA);
255
256 // element connectivity array with local node numbering [0 to (nbNodes-1)]
257 if (nbFacets)
258 {
259 connectA = (int *)malloc(nbFacets * 4 * sizeof(int));
260 Ufread(connectA, sizeof(int), nbFacets * 4);
261 free(connectA);
262
263 // deleted elements : the deleted elements stay in their original parts,
264 // the delEltA indicates which elements are deleted or not
265 delEltA = (char *)malloc(nbFacets * sizeof(char));
266 Ufread(delEltA, sizeof(char), nbFacets);
267 free(delEltA);
268 }
269 // parts definition: array containing an index on thelast facet which defines each part.
270 if (nbParts != 0)
271 {
272 defPartA = (int *)malloc(nbParts * sizeof(int));
273 Ufread(defPartA, sizeof(int), nbParts);
274 free(defPartA);
275
276 // part texts which defines the name of each part Each name does not exceed 50 characters.
277 for (i = 0; i < nbParts; i++){
278 Ufread(tmpText, sizeof(char), 50);
279 }
280 }
281 // array of the norm values for each nodes the norm are defined in uint16_t * 3000
282
283 normShortA = (uint16_t *)malloc(3 * nbNodes * sizeof(uint16_t));
284 Ufread(normShortA, sizeof(uint16_t), 3 * nbNodes);
285 free(normShortA);
286
287 // scalar values
288 if (nbFunc + nbEFunc)
289 {
290 // array of total scalar functions names (nodal + element)
291 for (i = 0; i < (nbFunc + nbEFunc); i++)
292 {
293 Ufread(tmpText, sizeof(char), 81);
294
295 if (strncmp(tmpText, "ZCHKSM_",7) == 0 )
296 {
297 std::string checksum(tmpText);
298 checksum = checksum.substr(7);
299 checksum_list.push_back(checksum);
300 }
301
302 }
303 funcA = (float *)malloc(nbFunc * nbNodes * sizeof(float));
304 eFuncA = (float *)malloc(nbEFunc * nbFacets * sizeof(float));
305 if (nbFunc){
306 Ufread(funcA, sizeof(float), nbNodes * nbFunc);
307 }
308
309 if (nbEFunc){
310 Ufread(eFuncA, sizeof(float), nbFacets * nbEFunc);
311 }
312 free(funcA);
313 free(eFuncA);
314 }
315 }
316 }
317 return checksum_list;
318}
319
320// Read Thime History file & retrieve checksums
321// --------------------------------------------------
323 {
324 int i,j;
325 int TH_Version;
326 char NameRequest[100];
327 char checksum[100];
328 char string_value[101];
329 float float_variable;
330 int dummy_variable;
331 int NUMMAT,NUMGEO,NVAR,NBELEM,NBSUBSF,NBPARTF,NSUBS;
332 int NPART_NTHPART,NTHGRP2,NGLOB;
333 int titleLength=0;
334 std::list<std::string> checksum_list;
335
336 Ufread(&dummy_variable,sizeof(int),1);
337
338 // Time History Version
339 Ufread(&TH_Version,sizeof(int),1);
340 if(TH_Version >= 4021){
341 titleLength = 100;
342 }
343 else if(TH_Version >= 3050){
344 titleLength = 100;
345 }
346 else if(TH_Version >= 3041){
347 titleLength = 80;
348 }
349 else{
350 titleLength = 40;
351 }
352
353 // Deck rootname
354 Ufread(string_value,sizeof(char),80,true);
355 Ufread(&dummy_variable,sizeof(int),1);
356
357 // deck version date
358 Ufread(&dummy_variable,sizeof(int),1);
359 Ufread(string_value,sizeof(char),80,true);
360 Ufread(&dummy_variable,sizeof(int),1);
361
362 if(TH_Version >= 3050)
363 {
364 // ADDITIONAL RECORDS
365 Ufread(&dummy_variable,sizeof(int),1);
366 Ufread(&dummy_variable,sizeof(int),1);
367 Ufread(&dummy_variable,sizeof(int),1);
368
369 // 1ST RECORD : title length
370 Ufread(&dummy_variable,sizeof(int),1);
371 Ufread(&dummy_variable,sizeof(int),1);
372 Ufread(&dummy_variable,sizeof(int),1);
373
374 // 2ND RECORD : FAC_MASS,FAC_LENGTH,FAC_TIME
375 Ufread(&dummy_variable,sizeof(int),1);
376 Ufread(&float_variable,sizeof(float),1);
377 Ufread(&float_variable,sizeof(float),1);
378 Ufread(&float_variable,sizeof(float),1);
379 Ufread(&dummy_variable,sizeof(int),1);
380 }
381
382 // HIERARCHY INFO
383 Ufread(&dummy_variable,sizeof(int),1);
384
385 // NPART_NTHPART, NUMMAT, NUMGEO, NSUBS, NTHGRP2, NGLOB
386 Ufread(&NPART_NTHPART,sizeof(int),1);
387 Ufread(&NUMMAT,sizeof(int),1);
388 Ufread(&NUMGEO,sizeof(int),1);
389 Ufread(&NSUBS,sizeof(int),1);
390 Ufread(&NTHGRP2,sizeof(int),1);
391 Ufread(&NGLOB,sizeof(int),1);
392
393 Ufread(&dummy_variable,sizeof(int),1);
394
395 // NGLOB Value
396 // -------------------------------------------------
397 if(NGLOB > 0)
398 {
399 Ufread(&dummy_variable,sizeof(int),1);
400 for(i=0;i<NGLOB;i++){
401 Ufread(&dummy_variable,sizeof(int),1);
402 }
403 Ufread(&dummy_variable,sizeof(int),1);
404 }
405
406 // Part Description
407 // -------------------------------------------------
408 if(NPART_NTHPART > 0)
409 {
410 for(i=0;i<NPART_NTHPART;i++){
411 Ufread(&dummy_variable,sizeof(int),1);
412 Ufread(&dummy_variable,sizeof(int),1);
413 Ufread(string_value,sizeof(char),titleLength,true);
414 //cout << "Part title : " << string_value << endl;
415 Ufread(&dummy_variable,sizeof(int),1);
416 Ufread(&dummy_variable,sizeof(int),1);
417 Ufread(&dummy_variable,sizeof(int),1);
418 Ufread(&NVAR,sizeof(int),1); // NVAR : number of variables
419 // cout << "NVAR : " << NVAR << endl;
420 Ufread(&dummy_variable,sizeof(int),1);
421 if (NVAR > 0){
422 int *dummy_array;
423 dummy_array = (int*)malloc((NVAR+2)*sizeof(int));
424 Ufread(dummy_array,sizeof(int),NVAR+2);
425 free (dummy_array);
426 }
427 }
428 }
429 // Material Description
430 // -------------------------------------------------
431 if(NUMMAT > 0)
432 {
433 for(i=0;i<NUMMAT;i++){
434 Ufread(&dummy_variable,sizeof(int),1);
435 Ufread(&dummy_variable,sizeof(int),1);
436 Ufread(string_value,sizeof(char),titleLength,true);
437 //cout << "Mat title : " << string_value << endl;
438 Ufread(&dummy_variable,sizeof(int),1);
439 }
440 }
441
442 // Properties Description
443 // -------------------------------------------------
444 if(NUMGEO > 0)
445 {
446 for(i=0;i<NUMGEO;i++){
447 Ufread(&dummy_variable,sizeof(int),1);
448 Ufread(&dummy_variable,sizeof(int),1);
449 Ufread(string_value,sizeof(char),titleLength,true);
450 //cout << "Prop title : " << string_value << endl;
451 Ufread(&dummy_variable,sizeof(int),1);
452 }
453 }
454
455 // Subset Description
456 // -------------------------------------------------
457 if(NSUBS > 0)
458 {
459 for(i=0;i<NSUBS;i++){
460 Ufread(&dummy_variable,sizeof(int),1);
461 Ufread(&dummy_variable,sizeof(int),1);
462 Ufread(&dummy_variable,sizeof(int),1);
463 Ufread(&NBSUBSF,sizeof(int),1); // NBSUBSF
464 Ufread(&NBPARTF,sizeof(int),1); // NBPARTF
465 Ufread(&NVAR,sizeof(int),1);
466 Ufread(string_value,sizeof(char),titleLength,true);
467 //cout << "Subset title : " << string_value << endl;
468 //cout << "NBSUBSF : " << NBSUBSF << endl;
469 //cout << "NBPARTF : " << NBPARTF << endl;
470 //cout << "NVAR : " << NBPARTF << endl;
471 Ufread(&dummy_variable,sizeof(int),1);
472
473 if (NBSUBSF > 0){
474 int* dummy_array;
475 dummy_array = (int*)malloc((NBSUBSF+2)*sizeof(int));
476 Ufread(dummy_array,sizeof(int),NBSUBSF+2);
477 free (dummy_array);
478 }
479
480 if (NBPARTF > 0){
481 int *dummy_array;
482 dummy_array = (int*)malloc((NBPARTF+2)*sizeof(int));
483 Ufread(dummy_array,sizeof(int),NBPARTF+2);
484 free (dummy_array);
485 }
486
487 if (NVAR > 0){
488 int *dummy_array;
489 dummy_array = (int*)malloc((NVAR+2)*sizeof(int));
490 Ufread(dummy_array,sizeof(int),NVAR+2);
491 free (dummy_array);
492 }
493 }
494 }
495
496 // Time History Group
497 // -------------------------------------------------
498 if(NTHGRP2 > 0)
499 {
500 for(i=0;i<NTHGRP2;i++){
501 Ufread(&dummy_variable,sizeof(int),1);
502 Ufread(&dummy_variable,sizeof(int),1);
503 Ufread(&dummy_variable,sizeof(int),1);
504 Ufread(&dummy_variable,sizeof(int),1);
505
506 Ufread(&NBELEM,sizeof(int),1); // NBELEM
507 Ufread(&NVAR,sizeof(int),1); // NVAR
508
509 Ufread(NameRequest,sizeof(char),titleLength,true);
510 // cout << "TH Group title : " << NameRequest << endl;
511
512 int isCheckSum = 0;
513 if (strncmp(NameRequest, "CHECKSUM", 8) == 0) isCheckSum = 1;
514
515 Ufread(&dummy_variable,sizeof(int),1);
516
517 for(j=0;j<NBELEM;j++){
518 Ufread(&dummy_variable,sizeof(int),1);
519 Ufread(&dummy_variable,sizeof(int),1);
520 Ufread(checksum,sizeof(char),titleLength,true);
521 if (isCheckSum == 1){
522
523 std::string checksum_str(checksum);
524 remove_trailing_blanks(checksum_str);
525 checksum_list.push_back(checksum_str);
526 //cout << "checksum : " << checksum_str << endl;
527 }
528 Ufread(&dummy_variable,sizeof(int),1);
529 }
530
531 int *dummy_array;
532 dummy_array = (int*)malloc((NVAR+2)*sizeof(int));
533 Ufread(dummy_array,sizeof(int),NVAR+2);
534 free (dummy_array);
535 }
536 }
537 return checksum_list;
538 }
539
540 // -----------------------------------------------------------------------------------
541 // Parse the .out file and extract checksums
542 // Returns a list of checksums
543 // The function assumes that the .out file is in the same directory as the input file
544 // -----------------------------------------------------------------------------------
545 // input:
546 // directory : directory where the .out file is located
547 // rootname : rootname of the .out file (without run number and extension)
548 // run_number: run number to be used in the .out file name
549 // output:
550 // list of checksums found in the .out file
551 // -----------------------------------------------------------------------------------
552 std::list<std::string> CheckSum_Output_Files::Out_File(std::fstream *new_file){
553 // -----------------------------------------------------------------------------------
554 std::list<std::string> checksum_list;
555
556 int not_found=1;
557 std::string line;
558 while (getline(*new_file, line) && not_found) {
559 remove_cr(line); // Remove carriage return characters
560 if (line == " CHECKSUM DIGESTS" || line == " CHECKSUM DIGESTS") { // Engine output format has 1 space, Starter
561 if (getline(*new_file, line)){ // 2 blank lines
562 if (getline(*new_file, line)){
563 while( not_found && getline(*new_file, line) ){ // Read all lines until "CHECKSUM :" is no more found
564 std::string comp=line.substr(0, 15);
565 if (comp == " CHECKSUM : "){
566
567 std::string checksum = line.substr(15);
568 checksum_list.push_back(checksum);
569
570 if (debug){
571 cout << "Checksum found: " << checksum << endl;
572 }
573
574 }else{
575 not_found = 0;
576 }
577 }
578 }
579
580 }
581 not_found=0; // Stop reading the file, we found the checksum section
582 }
583 }
584 return checksum_list;
585 }
586
587 std::list<std::tuple<std::string,std::string>> CheckSum_Output_Files::Checksum_File(std::fstream *new_file){
588 std::list<std::tuple<std::string,std::string>> checksum_list;
589 int not_found=1;
590 std::string line;
591 while (getline(*new_file, line) && not_found) {
592 remove_cr(line); // Remove carriage return characters
593 if (line == " OUTPUT FILES CHECKSUM DIGESTS") { // Engine output format has 1 space, Starter
594
595 if (getline(*new_file, line)){
596 // 1 blank lines
597 while( not_found && getline(*new_file, line) ){ // Read all lines until "CHECKSUM :" is no more found
598 if (line.length() > 4){
599 std::string comp=line.substr(4); // Remove front blanks
600 size_t pos =comp.find_last_of(' ');
601 std::string checksum = comp.substr(pos+1);
602 std::string filename = comp.substr(0,pos);
603
604 checksum_list.push_back(make_tuple(filename,checksum));
605
606 }else{
607 not_found = 0;
608 }
609 }
610
611 }
612 not_found=0; // Stop reading the file, we found the checksum section
613 }
614 }
615 return checksum_list;
616 }
617
#define SHORT2FLOAT
#define FASTMAGI10
void remove_trailing_blanks(std::string &str)
int open_binary_file(std::string filename)
void SWAP_MANY4BYTES(int *intPtr, size_t number)
void SWAP_MANY8BYTES(double *intPtr, size_t number)
int Ufread(void *pchar, size_t sizeOfItem, size_t numItems, bool text=false)
void SWAP_BYTESINDATA(void *itemList, size_t itemCount, size_t sizeOfItem)
void remove_cr(std::string &line)
std::list< std::string > Animation()
void SWAP_MANY2BYTES(uint16_t *intPtr, size_t number)
std::list< std::string > Out_File(std::fstream *new_file)
std::list< std::string > Time_History()
std::list< std::tuple< std::string, std::string > > Checksum_File(std::fstream *new_file)
int comp(int a, int b)