c++ Fstream只打印一个单词
C++ Fstream Only Prints One Word
这是一个非常奇怪的问题。我想打印一个大的文本文件,这是维基百科的条目。正好是关于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();
}
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 如何检查流中文件的下一个单词是否为 alpha?
- 给定一个单词数组和一个字符串,如何计算给定字符串中的所有单词
- 计算一个单词在映射中出现的次数 - 使用 transform() - 调用不匹配
- 如何将一个单词拆分成字母,并将它们放入一个无序的列表/集合中
- 将字符串中的单个单词替换为另一个单词
- 如何插入一个单词并将字母放在2D数组中的不同索引中
- C++ ifstream 只读一个单词的数量
- 我如何计算一个单词在数组中重复的次数
- 如何将 c 字符串转换为指针数组,其中每个指针都是 char 数组中的一个单词
- 将 C++ 类属性与分号前面的最后一个单词对齐;在 emacs 中
- 我试图编写一个代码来查找一个单词是否是回文,但它不起作用。怎么了?
- 我如何在一串随机生成的字母I C 中查找一个单词
- 在字符串中找到最后一个单词
- C++ 输出在读取文本文件时跳过最后一个单词
- 我如何将句子分成一个单词
- 在向量中通过一个单词查找行
- 'Try This'矢量在示例词典中哔哔一个单词。编程原理与实践
- 我怎样才能从字符串中得到一个单词
- 如何将文本(诗歌)拆分为行(字符串/字符[])并查找每个行的最后一个单词