Files and Streams
Parse File Lines
File lines can be parsed with std::stringstream after reading them.
line parsing
Read a line from a file, then use a string stream to split the line into typed values.
Parse File Lines
parse_file_lines.cpp
Replay: real traced execution (multi-file project)
#include <cstdio>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
int main() {
int minimum = 80;
std::string filename = "scores.txt";
std::ofstream setup(filename);
setup << "Ada 91" << std::endl;
setup << "Bjarne 74" << std::endl;
setup << "Grace 88" << std::endl;
setup.close();
std::ifstream input(filename);
std::string line;
int passed = 0;
while (std::getline(input, line)) {
std::stringstream parser(line);
std::string name;
int score = 0;
parser >> name >> score;
if (score >= minimum) {
++passed;
}
}
std::cout << "minimum=" << minimum << std::endl;
std::cout << "passed=" << passed << std::endl;
std::remove(filename.c_str());
return 0;
}
#include <cstdio>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
int main() {
int minimum = 70;
std::string filename = "scores.txt";
std::ofstream setup(filename);
setup << "Ada 91" << std::endl;
setup << "Bjarne 74" << std::endl;
setup << "Grace 88" << std::endl;
setup.close();
std::ifstream input(filename);
std::string line;
int passed = 0;
while (std::getline(input, line)) {
std::stringstream parser(line);
std::string name;
int score = 0;
parser >> name >> score;
if (score >= minimum) {
++passed;
}
}
std::cout << "minimum=" << minimum << std::endl;
std::cout << "passed=" << passed << std::endl;
std::remove(filename.c_str());
return 0;
}
#include <cstdio>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
int main() {
int minimum = 90;
std::string filename = "scores.txt";
std::ofstream setup(filename);
setup << "Ada 91" << std::endl;
setup << "Bjarne 74" << std::endl;
setup << "Grace 88" << std::endl;
setup.close();
std::ifstream input(filename);
std::string line;
int passed = 0;
while (std::getline(input, line)) {
std::stringstream parser(line);
std::string name;
int score = 0;
parser >> name >> score;
if (score >= minimum) {
++passed;
}
}
std::cout << "minimum=" << minimum << std::endl;
std::cout << "passed=" << passed << std::endl;
std::remove(filename.c_str());
return 0;
}
minimum ← 80, filename ← scores.txt, setup ← (empty), input ← (empty)
7int main() {8 int minimum→ 80 = 80; //@minimum=70, 909 std::string filename→ scores.txt = "scores.txt";1011 std::ofstream setup→ (empty)(filenamescores.txt);12 setup(empty) << "Ada 91" << std::endl;13 setup(empty) << "Bjarne 74" << std::endl;14 setup(empty) << "Grace 88" << std::endl;15 setup(empty).close();1617 std::ifstream input→ (empty)(filenamescores.txt);18 std::string line→ (empty);19 int passed→ 0 = 0;parser ← (empty), name ← (empty), score ← 0
pass 1 of 321while (std::getline(input(empty), lineAda 91)) {22 std::stringstream parser→ (empty)(lineAda 91);23 std::string name→ (empty);24 int score→ 0 = 0;2526 parser(empty) >> name→ Ada >> score→ 91;27 if (score >= minimum) {All 3 passes — pass 1 is the card above pass lineminimumparsernamescorepassed1 Ada 91 80 (empty) (empty) 0 0 → 1 2 Bjarne 74 — (empty) (empty) 0 — 3 Grace 88 80 (empty) (empty) 0 1 → 2 passed ← 1
pass 1 of 226parser >> name >> score;27if (score91 >= minimum80) {28 ++passed→ 1;29}passed ← 2
pass 2 of 226parser >> name >> score;27if (score88 >= minimum80) {28 ++passed→ 2;29}std::cout << "minimum=" << minimum << std::endl;
32 std::cout << "minimum=" << minimum80 << std::endl;33 std::cout << "passed=" << passed2 << std::endl;34 std::remove(filenamescores.txt.c_str());35 return 0;36}outputminimum=80 passed=2
minimum ← 70, filename ← scores.txt, setup ← (empty), input ← (empty)
7int main() {8 int minimum→ 70 = 70;9 std::string filename→ scores.txt = "scores.txt";1011 std::ofstream setup→ (empty)(filenamescores.txt);12 setup(empty) << "Ada 91" << std::endl;13 setup(empty) << "Bjarne 74" << std::endl;14 setup(empty) << "Grace 88" << std::endl;15 setup(empty).close();1617 std::ifstream input→ (empty)(filenamescores.txt);18 std::string line→ (empty);19 int passed→ 0 = 0;parser ← (empty), name ← (empty), score ← 0
pass 1 of 321while (std::getline(input(empty), lineAda 91)) {22 std::stringstream parser→ (empty)(lineAda 91);23 std::string name→ (empty);24 int score→ 0 = 0;2526 parser(empty) >> name→ Ada >> score→ 91;27 if (score >= minimum) {All 3 passes — pass 1 is the card above pass lineparsernamescore1 Ada 91 (empty) (empty) 0 2 Bjarne 74 (empty) (empty) 0 3 Grace 88 (empty) (empty) 0 passed ← 1
pass 1 of 326parser >> name >> score;27if (score91 >= minimum70) {28 ++passed→ 1;29}All 3 passes — pass 1 is the card above pass scorepassed1 91 0 → 1 2 74 1 → 2 3 88 2 → 3 std::cout << "minimum=" << minimum << std::endl;
32 std::cout << "minimum=" << minimum70 << std::endl;33 std::cout << "passed=" << passed3 << std::endl;34 std::remove(filenamescores.txt.c_str());35 return 0;36}outputminimum=70 passed=3
minimum ← 90, filename ← scores.txt, setup ← (empty), input ← (empty)
7int main() {8 int minimum→ 90 = 90;9 std::string filename→ scores.txt = "scores.txt";1011 std::ofstream setup→ (empty)(filenamescores.txt);12 setup(empty) << "Ada 91" << std::endl;13 setup(empty) << "Bjarne 74" << std::endl;14 setup(empty) << "Grace 88" << std::endl;15 setup(empty).close();1617 std::ifstream input→ (empty)(filenamescores.txt);18 std::string line→ (empty);19 int passed→ 0 = 0;parser ← (empty), name ← (empty), score ← 0
pass 1 of 321while (std::getline(input(empty), lineAda 91)) {22 std::stringstream parser→ (empty)(lineAda 91);23 std::string name→ (empty);24 int score→ 0 = 0;2526 parser(empty) >> name→ Ada >> score→ 91;27 if (score >= minimum) {All 3 passes — pass 1 is the card above pass lineminimumparsernamescorepassed1 Ada 91 90 (empty) (empty) 0 0 → 1 2 Bjarne 74 — (empty) (empty) 0 — 3 Grace 88 — (empty) (empty) 0 — passed ← 1
26parser >> name >> score;27if (score91 >= minimum90) {28 ++passed→ 1;29}std::cout << "minimum=" << minimum << std::endl;
32 std::cout << "minimum=" << minimum90 << std::endl;33 std::cout << "passed=" << passed1 << std::endl;34 std::remove(filenamescores.txt.c_str());35 return 0;36}outputminimum=90 passed=1