这是一个非常奇怪的问题。我正在尝试打印一个大文本文件,这是一个维基百科条目。它恰好是Velocity上的页面。因此,当我告诉它打印文件时,它会打印“In”,它应该打印“在物理,速度等等”。 这是我用来打印的代码:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream wiki;
wiki.open("./wiki/velocity.txt");
char* wikiRead;
wiki >> wikiRead;
cout << wikiRead << endl;
wiki.close();
}
请帮忙。
答案 0 :(得分:2)
wiki >> wikiRead;
stream的默认分隔符是空格,因此当流遇到空格时,它只是停止读取,这就是它只读取一个单词的原因。
如果您希望流读取所有单词,则必须使用循环:
char* wikiRead = new char[1024]; //must allocate some memory!
while(wiki >> wikiRead)
{
cout << wikiRead << endl;
}
wiki.close();
delete []wikiRead; //must deallocate the memory
这将打印文件中的所有单词,每个单词都在新行上。请注意,如果文件中的任何单词长度超过1024
,则此程序将调用未定义的行为,并且程序可能崩溃。在这种情况下,您需要分配更大的内存块。
但为什么首先使用char*
?在C ++中,您最好选择:使用std::string
。
#include<string>
std::string word;
while(wiki >> word)
{
cout << word << endl;
}
wiki.close();
现在好多了。
如果您想逐行阅读,而不是逐字逐句,请使用std::getline
作为:
std::string line;
while(std::getline(wiki, line))
{
cout << line << endl;
}
wiki.close();
这将读取一个完整的行,即使该行在单词之间包含空格,并将每行打印一个换行符。
答案 1 :(得分:0)
您要求流读取指针的(二进制)值(可能是4个字节,具体取决于您的机器架构),然后您要求它打印这4个字节指向的文本!
答案 2 :(得分:0)
我想知道为什么你忽略了编译器警告(大多数现代编译器警告你使用未初始化的变量)。怎么样?
ifstream wiki;
wiki.open("./wiki/velocity.txt");
char wikiRead[255];
wiki >> wikiRead;
cout << wikiRead << endl;
wiki.close();
或者,我建议您使用string
对象与getline
来获取单行文字。
string str;
getline(wiki, str);
答案 3 :(得分:0)
应用于>>
的{{1}}运算符只能读取一个单词。此外,您正在读取未初始化的指针,该指针无效。通常,char *
,而不是std::string
,用于C ++中的字符串处理。
如果您只想打印文件的内容,可以直接将文件的缓冲区挂钩到char *
:
std::cout
如果要将内容放入自动分配的字符串中,请在禁用分隔符的情况下使用int main() {
std::ifstream wiki("./wiki/velocity.txt");
std::cout << wiki.rdbuf() << '\n';
}
。
std::getline
答案 4 :(得分:0)
由于您想要读取大文件,因此逐块读取它是一种更好的方法。
ifstream wiki;
wiki.open("./wiki/velocity.txt");
const int buf_size = 1024;
char* wikiRead = 0;
int cnt = 1;
do
{
wikiRead = realloc( wikiRead, bufsize*cnt );
wiki.Read( wikiRead + (bufSize*(cnt-1)), buf_size ); //appends to reallocated memory
cnt++;
}while( !wiki.eof())
wikiRead[(bufSize*(cnt-2)) + wiki.gcount() + 1] = '\0'; // null termination.
wiki.Close();
cout << wikiRead;
delete[] wikiRead;
答案 5 :(得分:0)
operator>>
旨在一次只读一个字。如果您想阅读行,请使用getline
。
#include <iostream>
#include <fstream>
#include<string>
using namespace std;
int main()
{
ifstream wiki;
wiki.open("./wiki/velocity.txt");
string wikiRead;
while (getline(wiki, wikiRead))
{
cout << wikiRead << endl;
}
wiki.close();
}