Как скопировать 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;
}