Parent directory
Makefile
grades-malformed.txt
grades.txt
io1.cpp
io2.cpp
io3.cpp
CC = g++
CXX = g++
CFLAGS = -g -Wall
CXXFLAGS = -g -Wall -std=c++20
executables = io1 io2 io3
.PHONY: default
default: $(executables)
io1: io1.o
io2: io2.o
io3: io3.o
.PHONY: clean
clean:
rm -f *~ a.out core *.o $(executables)
.PHONY: all
all: clean default "Edgar Allan Poe" , 88.8
"Mark Twain",, 66.6
"Herman Melville",77.7 "Edgar Allan Poe" , 88.8
"Mark Twain", 66.6
"Herman Melville",77.7#include <iostream>
#include <iomanip>
void print_io_states(std::ios& io) {
std::cout << '\t';
std::cout << " fail()==" << io.fail();
std::cout << " bad()==" << io.bad();
std::cout << " eof()==" << io.eof();
std::cout << '\n';
}
int sum_ints(std::istream& is) {
int i, sum = 0;
while (is >> i) {
sum += i;
std::cout << "current sum: " << std::setw(4) << sum;
print_io_states(is);
}
return sum;
}
int main() {
int sum = sum_ints(std::cin);
std::cout << " final sum: " << std::setw(4) << sum;
print_io_states(std::cin);
}#include <iostream>
#include <iomanip>
void print_io_states(std::ios& io) {
std::cout << '\t';
std::cout << " fail()==" << io.fail();
std::cout << " bad()==" << io.bad();
std::cout << " eof()==" << io.eof();
std::cout << '\n';
}
int sum_ints(std::istream& is) {
int i, sum = 0;
while (!is.eof()) {
is >> i;
if (is.bad()) {
throw std::runtime_error{"bad istream"};
} else if (is.fail()) {
// fail(), but not bad()
if (is.eof()) {
// failbit && eofbit: this is normal (trailing whitespace)
break;
}
// failbit && !eofbit: probably non-digit; just skip it
is.clear();
char c;
is.get(c);
std::cout << " skipped: " << c << '\n';
} else {
// read i successfully;
// we could have hit eof or not (depends on trailing whitespace)
sum += i;
std::cout << "current sum: " << std::setw(4) << sum;
print_io_states(is);
}
}
return sum;
}
int main() {
int sum = sum_ints(std::cin);
std::cout << " final sum: " << std::setw(4) << sum;
print_io_states(std::cin);
}#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
using namespace std;
static ostream& operator<<(ostream& os, const pair<string,double>& e) {
return os << "[" << e.first << "] (" << e.second << ")";
}
static istream& operator>>(istream& is, pair<string,double>& e) {
char c;
// read opening quote, skipping whitespace
if (is >> c && c == '"') {
string student;
// read all chars into student, stop at closing quote, then discard it
if (std::getline(is, student, '"')) {
// read a comma, skipping whitespace
if (is >> c && c == ',') {
double grade;
if (is >> grade) {
// returns an std::pair of student & grade
e = make_pair(student, grade);
return is;
}
}
}
}
// if we are here, we could not read "student name", grade
is.setstate(ios_base::failbit);
return is;
}
void f1(istream& is);
void f2(istream& is);
void f3(const char* filename);
int main(int argc, char** argv) {
try {
f1(cin);
// f2(cin);
// f3(argv[1]);
} catch (const exception& x) {
cerr << x.what() << '\n';
}
}
void f1(istream& is) {
while (!is.eof()) {
is >> std::ws; // discard leading whitespace
if (!is || is.eof()) { // break if nothing else
break;
}
pair<string,double> e;
is >> e;
if (is.fail()) {
break;
}
cout << e << '\n';
}
if (is.bad()) {
throw runtime_error{"bad istream"};
} else if (is.fail()) {
throw invalid_argument{"bad grade format"};
}
}
void f2(istream& is) {
string str;
while (std::getline(is, str)) {
istringstream iss(str);
try {
f1(iss);
} catch (const invalid_argument& x) {
cerr << x.what() << ": " << str << '\n';
}
}
}
void f3(const char* filename) {
ifstream ifs { filename };
if (!ifs) {
if (filename != nullptr)
throw runtime_error{"can't open file: "s + filename};
else
throw runtime_error{"no file name provided"};
}
f2(ifs);
}