Ваш подход в принципе неплох. Тем не менее, вам нужно сделать немного больше проверки ошибок. И были также некоторые ошибки semanti c.
Это очень важное правило, что вы всегда проверяете там результат операций ввода / вывода.
Сначала я покажу вам исправленную версию, основанную на ваш первоначальный черновик:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <cmath>
using namespace std;
const string file_name = "r:\\input.txt";
float calculate_number(float first_number, char symbol, float last_number) {
float result{ 0 };
switch (symbol) {
case '+':
result = first_number + last_number;
break;
case '-':
result = first_number - last_number;
break;
case '*':
result = first_number * last_number;
break;
case '/':
result = first_number / last_number;
break;
case '%':
result = fmod(first_number, last_number);
break;
default:
break;
}
return result;
}
int main() {
ifstream input_file;
ofstream output_file;
// Open file to get input_file from
input_file.open(file_name, ios::in);
// Error checking
if (!input_file) {
cout << "Error: file input.txt does not exists\n";
exit(1);
}
else {
string data_from_file; // Declare string to store data from file
//input_file >> data_from_file; // Pass file content to data
while (getline(input_file, data_from_file)) {
istringstream ss(data_from_file);
char symbol;
float first_number, last_number;
// Rad data and check, if that worked
if (ss >> first_number >> symbol >> last_number) {
// Check for a valid symbol
if ((symbol == '+') || (symbol == '-') || (symbol == '*') || (symbol == '/') || (symbol == '%')) {
cout << first_number << " " << symbol << " " << last_number << " = "
<< calculate_number(first_number, symbol, last_number) << endl;
}
}
}
}
return 0;
}
После изучения дополнительных языков C ++ вы могли бы воспользоваться приведенным ниже решением.
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <numeric>
#include <map>
#include <utility>
#include <functional>
int main() {
// All possible operations, defined in one place
std::map<char, std::function<double(double,double)>> operation {
{'+', std::plus<double>()},
{'-', std::minus<double>()},
{'*', std::multiplies<double>()},
{'/', std::divides<double>()},
{'%', static_cast<double(*)(double,double)>(std::fmod) }
};
// The file with the source data
const std::string fileName{ "r:\\input.txt" };
// Open the source file and check if it could be opened
if (std::ifstream sourceStream(fileName); sourceStream) {
// Read all lines of the source file
for (std::string line{}; std::getline(sourceStream, line); ) {
// For easier processing, put the line in a std::stringstream
std::istringstream iss(line);
// The operands and the operator
double lhs{ 0.0 }, rhs{ 0.0 };
char operationSymbol{};
// Read the parts of the line and check, if read was OK
if (iss >> lhs >> operationSymbol >> rhs) {
// Now check, if we have read a valid operator
if (operation.find(operationSymbol) != operation.end()) {
// Show the result
std::cout << lhs << " " << operationSymbol << " " << rhs << " = " << operation[operationSymbol](lhs, rhs) << "\n";
}
else std::cerr << "\n*** Error: Invalid operator '" << operationSymbol << "'\n\n";
}
else std::cerr << "\n*** Error: Problem while reading line:\n'" << line << "'\n\n";
}
}
else std::cerr << "\n*** Error: Source file '" << fileName << "' could not be opened\n\n";
return 0;
}
Извините, но я не рекомендую ответы пользователя Onyrew и Тихана, которая использует даже глобальные переменные. Простите, ребята.