https://github.com/rec/tfile
📁 tiny C++11 file utilities 📁
https://github.com/rec/tfile
file-handling files raii tfile
Last synced: about 1 year ago
JSON representation
📁 tiny C++11 file utilities 📁
- Host: GitHub
- URL: https://github.com/rec/tfile
- Owner: rec
- License: artistic-2.0
- Created: 2015-11-15T21:48:19.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2019-02-02T19:36:42.000Z (over 7 years ago)
- Last Synced: 2025-03-24T04:04:07.185Z (over 1 year ago)
- Topics: file-handling, files, raii, tfile
- Language: C++
- Homepage:
- Size: 906 KB
- Stars: 22
- Watchers: 4
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
tfile - tiny C++11 file utilities
---------------------------
tfile is a tiny header-only library for C++11 and beyond which offers a small
number of essential features:
* functions to read a whole file at once, write a whole file at once,
and get the bytesize of a file;
* and Openers: zero-cost abstractions that wrap C's FILE* classic file
handle
The functions
=================
The functions:
* Read an entire file at once
`std::string tfile::read(char const* filename)`
* Write a sequence of bytes in memory to a file
`size_t write(char const* filename, char const* data, size_t length)`
* Write a null-terminated string to a file
`size_t write(char const* filename, char const* data)`
* Write a std::string to a file
`size_t write(char const* filename, const std::string& s)`
* Write a container of strings, adding line endings
`template size_t writeLines(const char* filename, C);`
* Write a begin, end range of strings, adding line endings
`template size_t writeLines(const char* filename, It begin, It end);`
* Get the size in bytes of a file
`size_t tfile::size()`
Examples of usage:
auto data = tfile::read("myfile.txt");
data += "another line\n";
tfile::write("myfile.txt", data);
std::cout << "myfile.txt: filesize=" << tfile::size("myfile.txt");
// Writes a file with three lines, using the line endings of the platform
tfile::writeLines("myfile.txt", {"line1", "line2", "line3"});
File Openers
==================
File Openers are for applications which need to keep a file open for
processing. File Openers are a thin wrapper over the C file handle type FILE*,
which is the basis of I/O in C and C++.
A File Opener offers these advantages over a raw FILE*:
* Automatically closes the FILE* in its destructor
* Prevents impossible reads or writes at compile time
* Throws an exception if the file won't open and exceptions are enabled
* Can iterate one line at a time
"Impossible reads or writes" means that there is nothing in C or C++ to
prevent writing code to, say, read from a write-only file handle - it will
simply return an error at runtime - but a File Opener provides read or
write methods only if they actually work, so these errors can be caught at
compile-time.
There are six File Openers, corresponding to the six modes in which files
can be opened:
* `tfile::Reader`: read-only, position at start of file - mode `"r"`
* `tfile::ReaderWriter`: read-write, position at start of file - mode `"r+"`
* `tfile::Writer`: write-only, truncate file to empty - mode `"w"`
* `tfile::TruncateReaderWriter`: read-write, truncate to empty - mode `"w+"`
* `tfile::Appender`: write-only, position at end of file - mode `"a"`
* `tfile::ReaderAppender`: read-write, position at end of file - mode `"a+"`
For the exact signatures of methods, see the file
[tfile.h](https://github.com/rec/tfile/blob/master/include/tfile/tfile.h).
For more information on file opening modes, see
http://man7.org/linux/man-pages/man3/fopen.3.html
Examples of usage:
tfile::Reader reader("myfile2.txt");
std::string s(10);
auto bytes_read = reader.read(s); // at most 10
// You can't write a reader, so this won't compile:
// reader.write("hello");
// Open a file, appear a line, close it.
tfile::Appender("myfile2.txt").writeLine("a new line");
// You can't read an Appender, so this won't compile:
// tfile::Appender("myfile2.txt").read();
// Iterate through lines.
std::string line;
while (reader.readLine(line)) {
// Do things to `line` here
}
// Another way to do that:
reader.forEachLine([] (const std::string& line) {
// Do things to `line` here
});