我正在尝试将文本从文本文档转换为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;
我对这个问题进行了研究,但我找不到任何可以解决这个问题的东西。
答案 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))
{
//...
}