Как читать несколько файлов на C ++ - PullRequest
1 голос
/ 19 января 2020

Моя проблема:

Сначала прочитайте файл с именем symbols.txt. Этот файл состоит из множества строк, каждая строка состоит из 2 элементов: заглавной буквы и строки, этот файл заканчивается знаком ha sh (#).

Второе чтение файла с именем dict.txt. Этот файл состоит из многих слов (строка). Завершается ха sh (#)

Третье чтение файла с именем handin.txt. Этот файл состоит из нескольких чисел, над которыми вы собираетесь работать. Завершено ха sh (#)

Распечатать вывод в файле с именем handout.txt

Это мой код, но я не уверен, что позволю в прочитанном вводе справа. Пожалуйста, проверьте это для меня. Большое спасибо.

#include<bits/stdc++.h>
using namespace std;

int main() {

    freopen("symbols.txt" , "r" , stdin);

         //  input the letter and the string 

    char X ; string Y ;

    while(cin >> X >> Y && X != '#' )  {
         // my code goes here
    }

    freopen("dict.txt" , "r" , stdin) ;

          // input the strings here 

    freopen("handin.txt", "r" , stdin);

         // input the numbers here


    / *

          Here is my code 

    * /

    freopen("handout.txt" , "w" , stdout);

    // let in print the output here



}

1 Ответ

4 голосов
/ 19 января 2020
#include<bits/stdc++.h>

Не делай этого. Вот почему


using namespace std;

Не делайте этого тоже. Вот почему


freopen("symbols.txt" , "r" , stdin);

Это очень плохо! Вы используете std::freopen, чтобы связать файл с stdin. Позже вы используете std::cin для чтения из файла. То, что вы делаете, очень «хакерски», и иногда это может работать, но не всегда. stdin (из C) и std::cin (из C ++) не обязательно должны быть связаны подобным образом. freopen - это API C, поэтому вы не должны использовать его в C ++.

Что вам нужно сделать, это открыть поток входного файла (std::ifstream) и прочитать из который. Это может выглядеть примерно так:

#include <string> // std::string
#include <fstream> // std::ifstream std::ofstream
#include <iostream> // std::cerr

int main() {
  std::ifstream symbols("symbols.txt");
  if (!symbols.is_open()) {
    // There was a problem opening the symbols file
    // Maybe it was missing
    // You should end the program here and write an error message
    std::cerr << "Failed to open \"symbols.txt\"\n";
    // returning an error code of 0 means "everything is fine"
    // returning anything else means "something went wrong"
    return 1;
  }

  // Try to choose more descriptive names than "X" and "Y"
  char X;
  std::string Y;
  while (symbols >> X >> Y && X != '#') {
    // ...
  }

  // ...
}

Ваш код будет более понятным, если вы создадите новый std::ifstream для каждого открываемого файла (вместо повторного использования одного и того же). Проверка ошибок важна. Вы должны убедиться, что файл действительно открыт перед его использованием. Чтобы записать вывод в "handout.txt", вместо этого вы должны использовать поток выходного файла (std::ofstream).


Есть что-то, что может вас запутать. Возьмите этот "symbols.txt" файл:

A many words
B on the same line
C could cause problems
#

Если мы попытаемся прочитать его, используя текущий код, у нас возникнут проблемы:

symbols >> X >> Y;
// X is 'A'
// Y is "many" rather than "many words" as you might expect

Если в каждой строке есть только одно слово, тогда это не должно быть проблемой, но если есть несколько слов, вам, возможно, придется использовать std::getline. std::getline делает то, что говорит на банке. Он читает всю строку и записывает ее в заданную строку.

Вы бы использовали это так:

while (symbols >> X && X != '#' && std::getline(symbols, Y)) {
  // ...
}

Пожалуйста, убедитесь, что вы понимаете код (прочитайте некоторые из ссылки) перед копированием из StackOverflow.

...