A
Alex Vinokur
What is wrong with small_buffer in program below?
I/O getline doesn't read data from file into small (relative to file line size) buffer.
====== foo.cpp ======
#include <cassert>
#include <iostream>
#include <fstream>
using namespace std;
void read_using_io_getline ()
{
char small_buffer[4];
char big_buffer[512];
ifstream infile ("foo.in");
assert (infile.is_open());
cout << infile.rdbuf() << endl;
// --------------------------
infile.clear ();
infile.seekg (0, ios::beg);
cout << endl;
cout << "[small_buffer] Start: sizeof(small_buffer) = " << sizeof(small_buffer) << endl;
cout << "[small_buffer] Start: rdstate = " << infile.rdstate() << endl;
while (infile.getline (small_buffer, sizeof(small_buffer)))
{
cout << "[small_buffer] Read: " << small_buffer << '\n';
}
cout << "[small_buffer] Finish: rdstate = " << infile.rdstate() << endl;
// --------------------------
infile.clear ();
infile.seekg (0, ios::beg);
cout << endl;
cout << "[big_buffer] Start: sizeof(big_buffer) = " << sizeof(big_buffer) << endl;
cout << "[big_buffer] Start: rdstate = " << infile.rdstate() << endl;
while (infile.getline (big_buffer, sizeof(big_buffer)))
{
cout << "[big_buffer] Read: " << big_buffer << '\n';
}
cout << "[big_buffer] Finish: rdstate = " << infile.rdstate() << endl;
}
int main()
{
read_using_io_getline ();
return 0;
}
=====================
====== Compilation & Run ======
// gpp.exe (GCC) 3.4.1
$ gpp foo.cpp
// No errors/warnings
$ ./a
1234567890
ABCDEGHIJKL
XYZUWT
[small_buffer] Start: sizeof(small_buffer) = 4
[small_buffer] Start: rdstate = 0
[small_buffer] Finish: rdstate = 4
[big_buffer] Start: sizeof(big_buffer) = 512
[big_buffer] Start: rdstate = 0
[big_buffer] Read: 1234567890
[big_buffer] Read: ABCDEGHIJKL
[big_buffer] Read: XYZUWT
[big_buffer] Finish: rdstate = 6
================================
I/O getline doesn't read data from file into small (relative to file line size) buffer.
====== foo.cpp ======
#include <cassert>
#include <iostream>
#include <fstream>
using namespace std;
void read_using_io_getline ()
{
char small_buffer[4];
char big_buffer[512];
ifstream infile ("foo.in");
assert (infile.is_open());
cout << infile.rdbuf() << endl;
// --------------------------
infile.clear ();
infile.seekg (0, ios::beg);
cout << endl;
cout << "[small_buffer] Start: sizeof(small_buffer) = " << sizeof(small_buffer) << endl;
cout << "[small_buffer] Start: rdstate = " << infile.rdstate() << endl;
while (infile.getline (small_buffer, sizeof(small_buffer)))
{
cout << "[small_buffer] Read: " << small_buffer << '\n';
}
cout << "[small_buffer] Finish: rdstate = " << infile.rdstate() << endl;
// --------------------------
infile.clear ();
infile.seekg (0, ios::beg);
cout << endl;
cout << "[big_buffer] Start: sizeof(big_buffer) = " << sizeof(big_buffer) << endl;
cout << "[big_buffer] Start: rdstate = " << infile.rdstate() << endl;
while (infile.getline (big_buffer, sizeof(big_buffer)))
{
cout << "[big_buffer] Read: " << big_buffer << '\n';
}
cout << "[big_buffer] Finish: rdstate = " << infile.rdstate() << endl;
}
int main()
{
read_using_io_getline ();
return 0;
}
=====================
====== Compilation & Run ======
// gpp.exe (GCC) 3.4.1
$ gpp foo.cpp
// No errors/warnings
$ ./a
1234567890
ABCDEGHIJKL
XYZUWT
[small_buffer] Start: sizeof(small_buffer) = 4
[small_buffer] Start: rdstate = 0
[small_buffer] Finish: rdstate = 4
[big_buffer] Start: sizeof(big_buffer) = 512
[big_buffer] Start: rdstate = 0
[big_buffer] Read: 1234567890
[big_buffer] Read: ABCDEGHIJKL
[big_buffer] Read: XYZUWT
[big_buffer] Finish: rdstate = 6
================================