Преобразование текстового документа в массив символов c ++ - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь преобразовать текст из текстового документа в массив символов.Для начала я попытался реализовать динамический массив.Однако, по какой-то причине, когда я пытаюсь сохранить каждый символ из текста в новый массив, он возвращает набор знаков равенства.Ниже у меня есть то, что у меня есть:

Скажем, например, что текст говорит что-то вроде "Сделать это массив символов".

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    char x;
    int y = 0;
    ifstream file;
    file.open("text.txt");
    while (file >> x)
        y++;

    char *phrase = NULL;
    phrase = new char[y];

    for (int i = 0; file >> x; i++)
    {
        phrase[i] = x;
    }
    for (int i = 0; i < y; i++)
    {
        cout << phrase[i];
    }
}

В итоге он выдаст: "================== "

Я провел исследование по этой проблеме, но не смог найти ничего, что могло бы ее прояснить.

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Вот еще один подход:

#include <fstream>
#include <iterator>
#include <algorithm>

int main() {
    std::ifstream file("text.txt");
    std::vector<char> text;
    std::copy(std::istream_iterator<char>(file),
        std::istream_iterator<char>(),
        std::back_inserter(text));
    // now text holds the contents of the file
    // if you really need a char array, you can use text.data()
}

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

0 голосов
/ 12 июня 2018

Вот один из способов сделать это:

std::ifstream file("text.txt", std::ios::binary | std::ios::ate);
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);

std::vector<char> buffer(size);
if (file.read(buffer.data(), size))
{
    //...
}
0 голосов
/ 12 июня 2018

Вы, похоже, «измеряете» длину файла, многократно читая отдельные символы из него.Вам не нужно этого делать - просто определите размер перед открытием файла:

#include <filesystem>
#include <fstream>  

int main() {
    auto file_name { "text.txt" };
    auto size = std::filesystem::file_size(file_name);
    std::ifstream file(file_name);
    // etc. etc.

См. Документацию для функции file_size().Это в C ++ 17;если вы используете более раннюю версию языка, попробуйте >experimental/filesystem> с C ++ 14, или иначе библиотеку boost::filesystem с любой версией C ++.

...но на самом деле вам вообще не нужно это делать !

Вы можете просто прочитать весь файл, используя обычные стандартные библиотеки C ++:

#include <sstream>
#include <iostream>
#include <fstream>

int main() {
    std::ifstream file("text.txt");
    if (not file) { /* handle error */ }
    std::stringstream sstr;
    sstr << file.rdbuf(); // magically read all of the file!
    auto entire_file_contents = sstr.str();
    const char* arr = entire_file_contents.c_str();
    // Now do whatever you like with the char array arr
}

См. Также: Как лучше всего прочитать весь файл в std :: string в C ++?

Кстати, определить размер файла довольно сложно.с std::ifstream без сортировки всего файла, см. этот ответ .

...