将文本文档转换为char数组c ++

时间:2018-06-11 23:04:45

标签: c++ file dynamic-arrays

我正在尝试将文本从文本文档转换为char数组。首先,我尝试实现动态数组。但是,出于某种原因,当我尝试将每个字符串从文本保存到新数组时,它会返回一堆等号。下面是我所拥有的:

比如说文本说的是"将它变成一个char数组"。

#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];
    }
}

它最终会输出:&#34; ==================&#34;

我对这个问题进行了研究,但我找不到任何可以解决这个问题的东西。

3 个答案:

答案 0 :(得分:4)

你似乎是&#34;测量&#34;通过重复读取文件中的单个字符来确定文件的长度。您不需要这样做 - 只需在打开文件之前确定大小:

#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中;如果您使用的是该语言的早期版本,请尝试使用C ++ 14 >experimental/filesystem>,或使用任何版本的C ++编写boost::filesystem库。

...但实际上,您根本不需要完成

您可以使用普通的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
}

另见:What is the best way to read an entire file into a std::string in C++?

顺便说一句,给定std::ifstream而没有排序读取整个文件的文件大小很难确定,请参阅this answer

答案 1 :(得分:2)

这是另一种方法:

#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()
}

请注意,代码不会测试文件是否已成功打开。当流处于错误状态时,对流的I / O操作是无操作。是的,您可以检查您是否愿意,但并非绝对必要。

答案 2 :(得分:1)

以下是一种方法:

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))
{
    //...
}