Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <assert.h>
- #include <vector>
- inline void on_line(char *p, size_t size) {
- ///....
- }
- int main() {
- FILE *file = stdin;
- const size_t buf_size = 4096*4;
- size_t n = buf_size;
- char buf[buf_size + 1]; //+1 for fake '/n'
- std::vector<char> dynamic_line; //for lines, which spans buffer
- size_t i, j;
- i = n;
- j = n;
- buf[n] = '\n';
- bool use_dynamic_buffer = false;
- while (1) {
- assert(buf[n] == '\n'); //this assert makes code faster, LOL
- //volatile char p = buf[n];
- while (buf[i] != '\n') {
- ++i;
- }
- if (i < n) {
- assert(buf[i] == '\n');
- if (!use_dynamic_buffer) {
- on_line(buf + j, i - j);
- } else {
- assert(j == 0);
- dynamic_line.insert(dynamic_line.end(), buf, buf + i);
- on_line(&*dynamic_line.begin(), dynamic_line.size());
- dynamic_line.resize(0);
- use_dynamic_buffer = false;
- }
- ++i;
- j = i;
- } else {
- if (i > j) {
- dynamic_line.insert(dynamic_line.end(), buf + j, buf + i);
- use_dynamic_buffer = true;
- }
- j = 0;
- i = 0;
- if (n < buf_size) { //previos fread was last
- break;
- }
- n = fread(buf, 1, buf_size, file);
- buf[n] = '\n';
- }
- }
- if (!use_dynamic_buffer) { //special code for last line without EOL (common corner case for hand-made text files)
- if (i > j)
- on_line(buf + j, i - j);
- } else {
- dynamic_line.insert(dynamic_line.end(), buf + j, buf + i);
- if (dynamic_line.size())
- on_line(&*dynamic_line.begin(), dynamic_line.size());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement