C ++ чтение / запись в два разных файла (нужна помощь для понимания, какой синтаксис использовать) - PullRequest
0 голосов
/ 18 марта 2019

В настоящее время я работаю над этой программой для класса в моем университете. Я пробовал множественный подход без успеха. Я почти уверен, что это просто проблема конверсии, но я хочу понять разницу.

Что должна делать программа : Мы должны создать программу, которая запрашивает у пользователя два имени файла. Один будет входом, а другой будет выходом. Предполагается, что программа считывает ввод и записывает строку в вывод, пока не будет достигнут конец входного файла.

Мой код :

#include <iostream>
#include <fstream> //included for read/writing files
#include <string> //Included this for getline to read the file

using namespace std;

int main() {

    ifstream infile; // Stream to read from input file
    ofstream outfile; // Stream to write to output file
    char inputfilename[80], outputfilename[80]; //declaring two character arrays to save the file names.
    string text;

    cout << "What is the name of your input file (text.txt)" ; // Prompting user for input file name
    cin >> (inputfilename); // Getting input file
    infile.open(inputfilename, ios::in); // Opening the input file.
    cout << "What is the name of your output file" ; // Prompting user for output file name
    cin >> (outputfilename);
    outfile.open(outputfilename, ios::out);
    if(!infile) { // If cannot open file 

        cout << "There was an error opening your file!" ;
        return 1; 

    }
    if (!outfile) {

        cout << "There was an error opening your file!" ;
        return 1; 

    }
    while (infile.eof()==0) {

        fgets(text, 80, infile);
        fprintf(outfile,"%d.  %s\n", text);

    }

    infile.close();  // Closing input file
    outfile.close(); // Closing output file

    return 0;
}

Что я пробовал : Я не знал, повлияло ли это на то, как я открыл файл. Я ранее пытался.

    ifstream infile;
    ofstream outfile;
    char text, inputfilename[80], outputfilename[80]; <----- 1
    cout << "What is the name of your input file (text.txt)" ;
    gets(inputfilename); <----- 2
    infile.open(inputfilename);
    cout << "What is the name of your output file" ;
    gets(outputfilename); <----- 2
    outfile.open(outputfilename);

1) Я переключил символ, который я ранее пытался

char text 
char text[80]
char *text[80]

2) Изменит ли переключение, как получение имени файла что-либо в цикле while (я ранее пробовал getline и gets)? Кроме того, "f" перед fgets / fprints / etc всегда ассоциируется с потоком файлов?

Примечание: мой учитель подсказал нам.

"Предположим, что вы прочитали строку из входного файла в строковую переменную с именем str, используя следующую инструкцию: fgets (str, 80, infile); Вы можете добавить номер строки и сохранить строку с номером строки в выходных данных. файл с использованием того же оператора, используя: fprintf (outfile, "% d.% s \ n", Next_line_number ++, str); "

из этого я пробовал:

while (infile.eof()==0) {

        fgets(text, 80, infile);
        fprintf(outfile,"%d.  %s\n", text);

    }

а также

while (infile.eof()==0) {
        fgets(text, 80, infile);
        fputs(text, outFile);

}

и

while (infile.eof()==0) {
        getline(infile, text);
        fprintf(outfile,"%d.  %s\n", text);

    }

Я также пытался сделать long и использовать его для увеличения номера строки. Я довольно новичок в программировании; если какой-либо из методов, которые я использую, датирован, пожалуйста, дайте мне знать (на некоторых сайтах говорилось, что fgets устарел и не поддерживается на cx11 или какой-либо версии C ++)! Я хочу понять концепции и просто запустить программирование. Следует отметить, что строки 34-35 - это место, где мой код всегда выдает ошибку, и это

не может преобразовать 'std :: __ cxx11 :: string {aka std :: __ cxx11 :: basic_string}' в 'char *' для аргумента '1' в 'char * fgets (char *, int, FILE *)'

Я подумал, что получаю это, потому что в нем есть указатель на файл, и я спрашиваю пользователя, не объявил ли файл в программе. Это вызывает преобразование, которое вызывает мою ошибку.

1 Ответ

1 голос
/ 18 марта 2019
fgets(text, 80, infile);

fgets() - это функция библиотеки C, которая ожидает char * в качестве первого параметра.Он абсолютно ничего не знает ни о каком классе C ++, а только о std::string, который вы передаете в качестве первого параметра.fgets() также не имеет ни малейшего представления о классе C ++ std::ifstream, который вы пытаетесь передать ему в качестве третьего параметра.И это именно то, что говорится в сообщении об ошибке вашего компилятора.

Вы случайным образом путаете код C и C ++, что приводит к неоднократной путанице.

char inputfilename[80], outputfilename[80];

Вы также должны использовать std::string s,здесь вместо массивов в стиле C произвольного размера.

while (infile.eof()==0) {

Это всегда ошибка , и прочтите эту статью для получения дополнительной информации.

fprintf(outfile,"%d.  %s\n", text);

Опять же: fprintf также является функцией библиотеки C, которая абсолютно ничего не знает о классах C ++, таких как std::string и std::ofstream.В любом случае это ошибка, поскольку в этой строке есть заполнители для двух параметров: целое число, %d и строка в стиле C, %s;и вы даете здесь только один параметр, text.Если бы вы писали C вместо кода C ++, это тоже не сработало бы, но это в основном академично.Это программа на C ++, и эта функция библиотеки C не имеет здесь никакого отношения к делу, во-первых.

Когда вы читаете из std::ifstream:

  • Вы можете использовать std::getline для чтения всей строки текста в std::string

  • В качестве альтернативы вы можете использовать отформатированный оператор >>

  • Или вы можете использовать различные методы объекта std::ifstream для чтения из файла и в подходящий буфер.

Эти альтернативы не эквивалентны (в противном случае какой смысл?) и они делают разные вещи, и правильное использование зависит от требований.

Аналогично, для записи в std::ofstream вы можете использовать:

  • Оператор форматирования <<.

  • Различные методы самого объекта std::ofstream.

И, в некоторых сложных ситуацияхвы можете воспользоваться библиотекой итераторов и реализовать чтение и запись с помощью ввода иИтераторы utput тоже.

Правильный подход зависит от конкретной ситуации.Для получения дополнительной информации о том, как читать и писать из файлов в C ++ с использованием этих подходов, см. Любую хорошую книгу C ++ .Какую бы книгу C ++ на самом деле ни советовали вам использовать fgets() для чтения из std::ifstream и в std::string: выбросьте ее и получите лучшую книгу из списка, указанного выше.Если это именно то, что вы нашли в какой-то программе в Интернете - вы не можете выучить C ++ таким образом, собрав воедино разные части разных программ и надеясь, что результаты сработают.Чтобы исправить все ваши ошибки компиляции: удалите весь тот код C, который абсолютно ничего не знает о C ++, и замените его на надлежащий код C ++, используя любой из вариантов, которые я обрисовал в общих чертах выше, используя примеры из книг C ++, связанных выше, в качестве ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...