tara lara Ответов: 2

Чтение и запись текстовых файлов C++ не работает


Привет. Я хотел научиться читать и писать файлы на C++. Чтобы лучше понять это, я написал код ниже. Приведенный ниже код позволяет пользователю создать свой собственный текстовый файл. После этого они могут записать в него информацию. Наконец, содержимое файла будет напечатано на консоли.

Вот в чем проблема: код позволит пользователю создать текстовый файл, но не позволит ему ничего вводить в этот файл. Кроме того, поскольку программа останавливается после строки с надписью "Пожалуйста, введите текст:" (имейте в виду, что программа не позволит пользователю ничего вводить в этот момент), я не запускаю последнюю часть кода, которая должна прочитать то, что было в файле.

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

Я не смог найти информацию об этом, поэтому я хотел бы знать, есть ли кто-нибудь на "codeproject.com-это может мне помочь. Спасибо.

Что я уже пробовал:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string> 
using namespace std;
int main()
{
    cout << "Type in file name followed by the extention \".txt\"" << endl;
    string user_file;
    cin >> user_file;
    fstream file; //object of fstream class

    file.open(user_file, ios::out);
    if (!file)
    {
         cout << "File could not open" << endl;
         return 0;
    }
    cout << "File created." << endl;

    //write text into file
    char user_input[256];
    cout << "Please enter text: \n";
    std::cin.getline(user_input, 256);
    file << user_input;

    //cout << "For testing. User input is: " + user_input<< endl;
    file.close();//close the file
    system("pause");

    //open file to be read
    file.open(user_file, ios::in);
    if (!file)
    {
        cout << "File could not open" << endl;
        return 0;
    }
    cout << "Information in file: ";
    std::string line_;
    if (file.is_open())
    {
        while (getline(file, line_))
        {
            std::cout << line_ << endl;
        }
        file.close();
        std::cin.get();//for testing: will pause the screen
    }

    return 0;
}

2 Ответов

Рейтинг:
2

tara lara

Спасибо за дополнительную информацию. Я понимаю, что ты имеешь в виду. Наверное, мне нужно научиться пользоваться своим отладчиком. Кроме того, поскольку я все еще студент колледжа, изучающий кодирование, я не знал, что вы можете вводить ограничения в свой код! Я думаю, что это относится только к базам данных (например, к ограничениям записи для значений таблицы). Я постараюсь запомнить это в следующий раз. Наконец, я сидел и работал над этим весь день, и это оказалось решением (то есть я наконец-то получил его на работу). Я читал что-то о ключевом слове ".get ()", поэтому переключился на него, и это, похоже, сработало. Я опубликую его на случай, если он может помочь кому-то еще:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string> 
using namespace std;
int main()
{
    cout << "Type in a file name followed by the extention \".txt\"" << endl;
    string user_file;
    getline(cin, user_file);
    fstream file; //object of fstream class
   //opening file "sample.txt" in out(write) mode
    file.open(user_file, ios::out);
    if (!file)
    {
        cout << "Could not open file" << endl;
        return 0;
    }
    cout << "File created." << endl;
    //write text into file
    string user_input;
    cout << "Please enter text: \n";
    getline(cin, user_input);
    file << user_input << endl;
    //cout << "For testing. User input is: " + user_input<< endl;
    file.close();//close the file
    
    //open file to be read
    file.open(user_file, ios::in);
    if (!file)
    {
        cout << "Could not open file" << endl;
        return 0;
    }
    char ch; //read character
    cout << "File Information: ";
    while (true)
    {
        file.get(ch);
        if (file.eof())break;
        cout << ch;
    }
    
    file.close();

    cout << "Lets find a file and open it" << endl;
    cout << "Type the name of the file followed by it's the extention \".txt\": " << endl;
    string find_user_file;
    getline(cin, find_user_file);

    //open file to be read
    file.open(find_user_file, ios::in);
    if (!file)
    {
        cout << "Could not open file" << endl;
        return 0;
    }
    char ch2; //read character
    cout << "File Information: ";
    while (true)
    {
        file.get(ch2);
        if (file.eof())break;
        cout << ch2;
    }
    file.close();
    system("pause");
    return 0;
}


Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Избегайте использования решения

tara lara

Хорошо. Я так и сделаю. Извиняюсь. Я никогда не использую этот сайт, поэтому я не знал об этом.

Patrice T

всегда пожалуйста :)

Рейтинг:
1

Rick York

I don't see a problem in the code immediately. Therefore, I have a suggestion for you. Comment off all of the code that prompts and acquires input and do all of that yourself with pseudo-random values. What I mean is come up with the name of a file by yourself and use that. Open the file as you normally would but write five or ten lines of text into it. Something along the lines of "this is message number X". Then close the file, delay for about a second, open the file for reading, and read and output all of the text you find in the file. This will verify your grasp of the mechanics of handling files. Once you have that perfected then uncomment the code that asks for user-input and try your same code with the strings entered by the user.

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

Еще одна вещь - увидеть вашу строку user_input, а затем вызов функции getline? Видите, что у них общего?

Это очень плохо. Если вам нужен буфер фиксированного размера, то есть вы не можете использовать строковый объект, то сначала определите константу для максимального размера строки. Затем объявите свой символьный буфер размером на единицу больше, чтобы у вас было место для завершающего нулевого символа, а затем используйте эту константу в вызове getline. Вот что хотел бы получить этот код с максимальным размером 255 символов:

const size_t bufferSize = 255;
char user_input[ bufferSize + 1 ] = { 0 };
std::cin.getline( user_input, bufferSize );
Таким образом, входные данные никогда не могут превышать размер буфера и всегда будут завершаться нулем. Кроме того, если вы хотите изменить размер буфера, вы делаете это только в одном месте. Это и есть основная цель данной тактики.

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

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