fork(1) download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. void compress() {
  9. // 入力読み込み
  10. string outputFileName;
  11. string directory;
  12. int numOfFiles;
  13.  
  14. cin >> outputFileName
  15. >> directory
  16. >> numOfFiles;
  17.  
  18. struct fileInfo {
  19. string name;
  20. int size;
  21. };
  22. vector<fileInfo> files(numOfFiles);
  23. for(int i = 0 ; i < numOfFiles ; ++i)
  24. cin >> files[i].name >> files[i].size;
  25.  
  26. // 出力ファイルオープン
  27. ofstream ofs(outputFileName, ios::out | ios::binary | ios::trunc);
  28.  
  29. // ファイル数出力
  30. ofs.write((const char *)&numOfFiles, sizeof(numOfFiles));
  31.  
  32. // 各ファイル出力
  33. for(int i = 0 ; i < numOfFiles ; ++i) {
  34. fileInfo f = files[i];
  35.  
  36. // ファイル名出力
  37. int length = f.name.size();
  38. ofs.write((const char *)&length, sizeof(length));
  39. ofs.write(f.name.c_str(), length);
  40.  
  41. // ファイル読み込み
  42. vector<char> fdata(f.size);
  43. ifstream(directory + "/" + f.name, ios::in | ios::binary).read(fdata.data(), f.size);
  44.  
  45. // ファイル出力
  46. ofs.write((const char *)&f.size, sizeof(f.size));
  47. ofs.write(fdata.data(), f.size);
  48. }
  49. }
  50.  
  51. void decompress() {
  52. // 入力読み込み
  53. string compressedFileName;
  54. string outputDirectory;
  55.  
  56. cin >> compressedFileName
  57. >> outputDirectory;
  58.  
  59. ifstream ifs(compressedFileName, ios::in | ios::binary);
  60. // ファイル総数の読み取り
  61. int numOfFiles;
  62. ifs.read((char *)&numOfFiles, sizeof(numOfFiles));
  63.  
  64. for(int i = 0 ; i < numOfFiles ; ++i) {
  65. // ファイル名の読み取り
  66. int length;
  67. ifs.read((char *)&length, sizeof(length));
  68. vector<char> filename(length + 1);
  69. ifs.read(filename.data(), length);
  70.  
  71. // ファイルデータの読み取り
  72. int size;
  73. ifs.read((char *)&size, sizeof(size));
  74. vector<char> fdata(size);
  75. ifs.read(fdata.data(), size);
  76.  
  77. // ファイル書き出し
  78. ofstream(outputDirectory + "/" + filename.data(), ios::out | ios::binary | ios::trunc).write(fdata.data(), size);
  79. }
  80. }
  81.  
  82. int main() {
  83. string command;
  84.  
  85. cin >> command;
  86.  
  87. if(command == "encode") {
  88. compress();
  89. } else if(command == "decode") {
  90. decompress();
  91. }
  92. }
  93.  
Success #stdin #stdout 0s 4372KB
stdin
Standard input is empty
stdout
Standard output is empty