Почему я получаю сообщение об ошибке, если ifstream создает файл со строкой, считываемой с клавиатуры? - PullRequest
0 голосов
/ 19 июня 2019

Я делаю упражнения из книги Бьярна Страуструпа, Принципы и практика программирования с использованием C ++ .Я выполняю первое упражнение в главе 10 , где говорится, что нужно написать программу, которая выдает сумму всех чисел в файле целых чисел, разделенных пробелами.Я основал свой код ниже на том, что используется для Упражнения 2 из Глава 10.5 .Я получаю сообщение об ошибке при создании объекта ifstream.Вот код, который я пытаюсь запустить:

#include "../../std_lib_facilities.h"

int main(int argc, const char * argv[]) {
    // insert code here...

    cout << "Plese enter the input file name: " << endl;
    string iname;
    cin >> iname;
    ifstream ist {iname};
    if (!ist) error("Can't open input file ",iname);

    vector<int> numbers;
    int sum;
    int n;
    while(ist>>n) {
        numbers.push_back(n);
    }

    for (int i=0; i<numbers.size(); ++i) {
        sum += numbers[i];
    }
    cout << sum << endl;

    return 0;
}

Любой вводимый мной код вызывает ошибку.Я пробовал myin, myin.txt или любое другое имя.error("Can't open input file ",iname); из библиотеки, созданной автором.

Я знаю, что файл существует в том же каталоге, что и main.cpp, и создан с помощью TextEdit из Mac, используя формат для обычного текста.

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

[...] в том же каталоге, что и main.cpp [...]

Неважно, куда вы поместите входной файл относительно исходного файла. Файл должен находиться в текущем рабочем каталоге среды при запуске программы.

1 голос
/ 19 июня 2019

Должно быть некоторое замешательство в передаче аргумента.Вы должны попытаться передать абсолютный путь к входному файлу.

Ниже ваше измененное приложение.Это создаст один тестовый файл и будет использовать его вместо запроса имени файла для случая 1. В случае 2 он использует файл, который не существует. (Удалить, если имеется)

#include <cstdio>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
template <typename T> void error(const T &t) { cout << t; }
template <typename T, typename... Args> void error(const T &t, Args... args) {
  cout << t << " ";
  error(args...);
  cout << "\n";
}

int main(int argc, const char *argv[]) {
  // insert code here...
  // cout << "Plese enter the input file name: " << endl;
  string iname = "a.txt";
  ofstream ofs{iname};
  ofs << 1 << " " << 2 << " " << 3 << " " << 4;
  ofs.close();
  //  cin >> iname;
  // part 1
  {
    cout << "Case1: Reading file a.txt which is just created\n";
    ifstream ist{iname};
    if (!ist)
      error("Can't open input file ", iname);
    if (ist.is_open()) {
      vector<int> numbers;
      int sum = 0;
      int n = 0;
      while (ist >> n) {
        numbers.push_back(n);
      }
      for (int i = 0; i < numbers.size(); ++i) {
        sum += numbers[i];
      }
      cout << sum << endl;
      ist.close();
    } else {
      error("can't open file to read", iname);
    }
  }
  // part 2
  {
    cout << "Case2:reading file which is not present\n";
    iname = "b.txt";
    std::remove(iname.c_str()); // delete if present
    ifstream ist{iname};
    if (!ist)
      error("Can't open input file ", iname);
    if (ist.is_open()) {
      vector<int> numbers;
      int sum = 0;
      int n = 0;
      while (ist >> n) {
        numbers.push_back(n);
      }
      for (int i = 0; i < numbers.size(); ++i) {
        sum += numbers[i];
      }
      cout << sum << endl;
      ist.close();
    } else {
      error("can't open file to read", iname);
    }
  }
  return 0;
}

Примечание. Построить из std::ifstream всегда создай объект.Вам нужно, чтобы его объект был как у вас, так и у is_open() метода.

...