summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskar <[email protected]>2024-09-13 15:19:34 +0200
committerOskar <[email protected]>2024-09-13 15:19:34 +0200
commitb7cb45b4af4d47f3453854dad3c4aea4abde1202 (patch)
treed9383bf2a14d817aaf06c0bbe6e0f4285cbcffc0
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--Makefile8
-rw-r--r--read_print_file.cpp138
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;
+}