c++ Fstream只打印一个单词

C++ Fstream Only Prints One Word

本文关键字:一个 单词 Fstream 打印 c++      更新时间:2023-10-16

这是一个非常奇怪的问题。我想打印一个大的文本文件,这是维基百科的条目。正好是关于Velocity的那一页。所以,当我告诉它打印文件时,它打印了"In",而它应该打印"In physics, velocity is等等,等等"。下面是我用来打印的代码:

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

请帮。

wiki >> wikiRead;

流的默认分隔符是空格,因此当流遇到空格时,它直接停止读取,这就是为什么它只读取一个单词。

如果你想让流读取所有的单词,你必须使用循环:

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();

这将读取一整行,即使该行单词之间包含空格,并将每行打印一个换行符。

您要求流读取指针的(二进制)值(可能是4个字节,取决于您的机器架构),然后您要求它打印这4个字节指向的文本!

我想知道为什么你忽略了编译器的警告(大多数现代编译器警告你使用未初始化的变量)。这个怎么样?

    ifstream wiki;
    wiki.open("./wiki/velocity.txt");
    char wikiRead[255];
    wiki >> wikiRead;
    cout << wikiRead << endl;
    wiki.close();

或者我建议你使用string对象与getline来获得单行文本。

string str;
getline(wiki, str);

应用于char *>>运算符只读取一个单词。此外,您正在读取一个未初始化的指针,这是无效的。在c++中,通常使用std::string而不是char *来处理字符串。

如果您只想打印文件的内容,您可以将文件的缓冲区直接挂钩到std::cout:

int main() {
    std::ifstream wiki("./wiki/velocity.txt");
    std::cout << wiki.rdbuf() << 'n';
}

如果您希望将内容放入自动分配的字符串中,请使用禁用分隔符的std::getline

int main() {
    std::ifstream wiki("./wiki/velocity.txt");
    std::string wiki_contents;
    getline( wiki, wiki_contents, '' /* do not stop at newline */ );
    std::cout << wiki_contents << 'n'; // do something with the string
}

由于您想要读取大文件,因此逐块读取是更好的方法。

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] = ''; // null termination.
wiki.Close();
cout << wikiRead;
delete[] wikiRead;

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