diff options
author | Oskar <[email protected]> | 2024-09-13 15:19:34 +0200 |
---|---|---|
committer | Oskar <[email protected]> | 2024-09-13 15:19:34 +0200 |
commit | b7cb45b4af4d47f3453854dad3c4aea4abde1202 (patch) | |
tree | d9383bf2a14d817aaf06c0bbe6e0f4285cbcffc0 |
first time trying out reading files and stuff, this is just a program to try out different methods of doing the same thing
-rw-r--r-- | Makefile | 8 | ||||
-rw-r--r-- | read_print_file.cpp | 138 |
2 files changed, 146 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dc2d83c --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +CC=clang++ +CFLAGS=-Wall -s -static -O3 -Wextra -DNDEBUG -fomit-frame-pointer -flto -std=c++20 + +all: + $(CC) $(CFLAGS) read_print_file.cpp -o rpf + +clean: + rm -f rpf diff --git a/read_print_file.cpp b/read_print_file.cpp new file mode 100644 index 0000000..5221c1d --- /dev/null +++ b/read_print_file.cpp @@ -0,0 +1,138 @@ +#include <iostream> +#include <filesystem> +#include <fstream> +#include <vector> +#include <unistd.h> +#define USAGE "rpf [-1][-2][-3] [FILE]" + +void PrintFile(const std::filesystem::path &path) { + + std::ifstream thisfile; + thisfile.open(path); + if(!thisfile.is_open()) { + std::cout << "Cannot open file" << std::endl; + return; + } + + thisfile.seekg(0, std::ios::end); // seek to end + auto size = thisfile.tellg(); // get size + std::string data(size, '\0'); // make string of appropriate size + thisfile.seekg(0, std::ios::beg); // seek to beginning of file + thisfile.read(&data[0], size); // read entire file in to string + std::cout << data; + std::cout << "File size: " << size << std::endl; + thisfile.close(); +} + +void PrintFileBUFFERED_SINGLE_CHAR(const std::filesystem::path &path) { + + std::ifstream thisfile; + thisfile.open(path); + if(!thisfile.is_open()) { + std::cout << "Cannot open file" << std::endl; + return; + } + + thisfile.seekg(0, std::ios::end); // seek to end + auto size = thisfile.tellg(); // get size + thisfile.seekg(0, std::ios::beg); // seek to beginning of file + while (!thisfile.eof()) { + std::vector<char> vecbuf(1024); + for(auto a = vecbuf.begin() ; a != vecbuf.end() ; ++a) { + *a = thisfile.get(); + } + + for(const auto &a : vecbuf) { + std::cout << a; + } + } + + std::cout << "File size: " << size << std::endl; + thisfile.close(); +} + +void PrintFileBUFFERED_READ(const std::filesystem::path &path) { + + std::ifstream thisfile; + thisfile.open(path); + if(!thisfile.is_open()) { + std::cout << "Cannot open file" << std::endl; + return; + } + + thisfile.seekg(0, std::ios::end); // seek to end + auto size = thisfile.tellg(); // get size + thisfile.seekg(0, std::ios::beg); // seek to beginning of file + while (!thisfile.eof()) { + std::vector<char> vecbuf(1024); + thisfile.read(vecbuf.data(), vecbuf.size()); + std::cout.write(vecbuf.data(), thisfile.gcount()); + } + + std::cout << "File size: " << size << std::endl; + thisfile.close(); +} + +inline void usageOUT() { + std::cerr << USAGE << std::endl; +} + +int main (int argc, char **argv) { + + if(argc < 3 || argc > 3) { + usageOUT(); + return EXIT_FAILURE; + } + + int opt; + int one = 0; + int two = 0; + int three = 0; + while ((opt = getopt(argc, argv, "123")) != -1) { + switch (opt) { + case '1': + + one = 1; + + break; + case '2': + + two = 1; + + break; + case '3': + + three = 1; + + break; + } + } + + if((one + two + three) > 1) { + usageOUT(); + return EXIT_FAILURE; + } + + int index; + std::filesystem::path path; + for (index = optind ; index < argc ; index++) { + path = argv[index]; + } + + if(one == 1) { + PrintFile(path); + std::cout << "PrintFile" << std::endl; + } + + if(two == 1) { + PrintFileBUFFERED_SINGLE_CHAR(path); + std::cout << "PrintFileBSC" << std::endl; + } + + if(three == 1) { + PrintFileBUFFERED_READ(path); + std::cout << "PrintFileBR" << std::endl; + } + + return EXIT_SUCCESS; +} |