我试图将整个.txt文件复制到char数组中。我的代码可以工作,但它会遗漏白色空格。因此,例如,如果我的.txt文件读取“I Like Pie”并将其复制到myArray,如果我使用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");
}
有什么建议吗? :/
答案 0 :(得分:33)
使用
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
具有范围构造函数,用于复制[first,last]范围内的字符序列请注意它不会复制最后,顺序相同:
template <class InputIterator>
string (InputIterator first, InputIterator last);
std::istreambuf_iterator
迭代器是输入迭代器,它从流缓冲区中读取连续的元素。
std::istreambuf_iterator<char>(in)
将为我们的ifstream in
(文件的开头)创建迭代器,如果你没有将任何参数传递给构造函数,它将创建end-of-stream迭代器(最后一个位置):
默认构造的std :: istreambuf_iterator称为流末端迭代器。当有效的std :: istreambuf_iterator到达底层流的末尾时,它变得等于流末尾迭代器。取消引用或递增它会进一步调用未定义的行为。
因此,这将从文件中的第一个字符开始复制所有字符,直到下一个字符结束为止。
答案 1 :(得分:9)
使用以下代码段:
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;
答案 2 :(得分:1)
一个简单的解决方案,如果您必须使用char数组,并对代码进行最少的修改。下面的代码段将包含所有空格和换行符,直到文件末尾。
while (!myfile.eof())
{
myfile.get(myArray[i]);
i++;
num_characters ++;
}
答案 3 :(得分:1)
更简单的方法是使用get()成员函数:
while(!myfile.eof() && i < arraysize)
{
myfile.get(array[i]); //reading single character from file to array
i++;
}
答案 4 :(得分:0)
这是您需要的代码段:
#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;
}