This program reads the files into vectors. The user is then prompted for the number of lines to generate and a pattern that allows addition of other information to the resulting line.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
// random/gen-random-data.cpp // Fred Swartz 2003-09-28 // This program reads two files of names, // 1000-first-names.txt and 1000-last-names.txt generated from // US Census data: http://www.census.gov/genealogy/names/ // It reads a pattern from the console where each character // has the following meaning: // L - Generate a last name // F - Generate a first name // d - generate a digit. Short for [0123456789] // [cccc] - Generate one of the chars between [ and ] // Enhancements: f = generate first name in mixed case. // l = same for last name. // \ = escape character // // Output is written to cout. Use redirection to save in file. // Eg, to generate 30 lines of scores 70-99 space first space last. // gen-random-data > test-data.txt // 30 // [789]d F L #include <iostream> #include <fstream> #include <string> #include <vector> #include <cstdlib> // for exit(), srand(), rand() using namespace std; //=============================================== prototypes void readNameFile(vector<string>& name_vec, string name_file); //=============================================== main int main() { vector<string> firstNames; vector<string> lastNames; ifstream readFnames; ifstream readLnames; srand(time(0)); // initialize seed "randomly" //--- Read the files of first and last names. readNameFile(firstNames, "first-names.txt"); readNameFile(lastNames , "last-names.txt" ); //--- Read count and pattern. Then generate random data. int count; cerr << "Enter number of lines of random data desired." << endl; cin >> count; string junk; getline(cin, junk); // read and ignore remainder of line. cerr << "Enter a pattern for each random line." << endl; string pattern; getline(cin, pattern); for (int i=0; i<count; i++) { string outputLine = ""; for (int c=0; c<pattern.size(); c++) { switch (pattern[c]) { case 'F' : // Random first name outputLine += firstNames[rand() % firstNames.size()]; break; case 'L' : // Random last name outputLine += lastNames[rand() % lastNames.size()]; break; case 'd' : // Random digit outputLine += "0123456789"[rand() % 10]; break; case '[' : // Random from specifed set { int end = c++; while (pattern[end] != ']') { end++; } outputLine += pattern[c + rand() % (end-c)]; c = end; } break; default: // Pass this character thru unchanged outputLine += pattern[c]; } } cout << outputLine << endl; } return 0; } //========================================================== readNameFile void readNameFile(vector<string>& name_vec, string name_file) { ifstream infile; infile.open(name_file.c_str()); if (!infile) { cerr << "Unable to read " << name_file << endl; exit(1); } for (string someName; infile >> someName; ) { name_vec.push_back(someName); } infile.close(); } |