Как скопировать TXT файл в массив char в С++

Im пытается скопировать весь .txt файл в массив char. Мой код работает, но он не содержит пробелов. Так, например, если мой .txt файл читает "Мне нравится пирог", и я копирую его в myArray, если я cout мой массив, используя цикл for, я получаю "ILikePie"

Вот мой код

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () 
{
  int arraysize = 100000;
  char myArray[arraysize];
  char current_char;
  int num_characters = 0;
  int i = 0;

  ifstream myfile ("FileReadExample.cpp");

     if (myfile.is_open())
        {
          while ( !myfile.eof())
          {
                myfile >> myArray[i];
                i++;
                num_characters ++;
          }      

 for (int i = 0; i <= num_characters; i++)
      {

         cout << myArray[i];
      } 

      system("pause");
    }

любые предложения?:/

Ответ 1

С

myfile >> myArray[i]; 

вы читаете файл слово за словом, что вызывает пропуски пробелов.

Вы можете прочитать весь файл в строке с помощью

std::ifstream in("FileReadExample.cpp");
std::string contents((std::istreambuf_iterator<char>(in)), 
    std::istreambuf_iterator<char>());

И затем вы можете использовать contents.c_str() для получения массива char.

Как это работает

std::string имеет конструктор диапазонов, который копирует последовательность символов в диапазоне [первая, последняя] отмечает, что она не будет копировать последнюю в том же порядке:

template <class InputIterator>
  string  (InputIterator first, InputIterator last);

std::istreambuf_iterator Итератор вводит итератор, который считывает последовательные элементы из буфера потока.

std::istreambuf_iterator<char>(in)

создаст итератор для нашего ifstream in (начало файла), и если вы не передадите какие-либо параметры конструктору, он создаст итератор конца потока (последняя позиция):

Построенный по умолчанию std:: istreambuf_iterator известен как итератор конца потока. Когда действительный std:: istreambuf_iterator достигает конца базового потока, он становится равным итератору конца потока. Выражение разыменования или добавление его далее вызывает поведение undefined.

Итак, это скопирует все символы, начиная с первого в файле, до тех пор, пока следующий символ не станет концом потока.

Ответ 2

Используйте следующий фрагмент кода:

FILE *f = fopen("textfile.txt", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);

char *string = (char *)malloc(fsize + 1);
fread(string, fsize, 1, f);
fclose(f);

string[fsize] = 0;

Ответ 3

Простое решение, если вы привязаны к массивам char и минимальной модификации вашего кода. Ниже приведенный ниже фрагмент будет содержать все пробелы и разрывы строк до конца файла.

      while (!myfile.eof())
      {
            myfile.get(myArray[i]);
            i++;
            num_characters ++;
      }  

Ответ 4

Более простой подход будет использовать функцию члена get():

while(!myfile.eof() && i < arraysize)
{
    myfile.get(array[i]); //reading single character from file to array
    i++;
}

Ответ 5

Вот фрагмент кода, который вам нужен:

#include <string>
#include <fstream>
#include <streambuf>
#include <iostream>


int main()
{
  std::ifstream file("name.txt");
  std::string str((std::istreambuf_iterator<char>(file)),
                        std::istreambuf_iterator<char>());

  str.c_str();

  for( unsigned int a = 0; a < sizeof(str)/sizeof(str[0]); a = a + 1 )
  {
    std::cout << str[a] << std::endl;
  }

  return 0;
}