C ++ Fstream只打印一个单词

时间:2011-08-05 04:59:55

标签: c++ fstream

这是一个非常奇怪的问题。我正在尝试打印一个大文本文件,这是一个维基百科条目。它恰好是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();
        }

请帮忙。

6 个答案:

答案 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();
}