我正在进行一项任务,我应该读取一个文件并计算行数并同时计算其中的单词。 我在while循环中尝试了getline和strtok的组合,但是没有用。
file:example.txt(要读取的文件)。
嗨,你好,这真是一个惊喜 欢迎来到这个地方。
愿你在这里过得愉快。
(3行,有些话)。
Readfile.cpp
#include <iostream>
#include <fstream>
#include<string>
using namespace std;
int main()
{
ifstream in("example.txt");
int count = 0;
if(!in)
{
cout << "Cannot open input file.\n";
return 1;
}
char str[255];
string tok;
char * t2;
while(in)
{
in.getline(str, 255);
in>>tok;
char *dup = strdup(tok.c_str());
do
{
t2 = strtok(dup," ");
}while(t2 != NULL);
cout<<t2<<endl;
free (dup);
count++;
}
in.close();
cout<<count;
return 0;
}
答案 0 :(得分:5)
刚刚做对了!! 刚刚删除了所有不必要的代码。
int main()
{
ifstream in("example.txt");
int LineCount = 0;
char* str = new char[500];
while(in)
{
LineCount++;
in.getline(str, 255);
char * tempPtr = strtok(str," ");
while(tempPtr)
{
AddWord(tempPtr, LineCount);
tempPtr = strtok(NULL," ,.");
}
}
in.close();
delete [] str;
cout<<"Total No of lines:"<<LineCount<<endl;
showData();
return 0;
}
BTW原始问题陈述是创建一个索引程序,它接受用户文件并创建所有单词的行索引。
答案 1 :(得分:3)
我还没有尝试过编译,但是这里有一个替代方法,它几乎和使用Boost一样简单,但没有额外的依赖。
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string line;
while (std::getline(std::cin, line)) {
std::istringstream linestream(line);
std::string word;
while (linestream >> word) {
std::cout << word << "\n";
}
}
return 0;
}
答案 2 :(得分:0)
答案 3 :(得分:0)
有这样的例子发布在互联网上。这是我在高中时回信的计数词程序。用它作为起点。我想指出的其他事情是:
std :: stringstream:你std :: getline整行,然后使用std :: stringstream将其切成小块并标记它。您可以使用std :: getline获取整行,并将其输入到std :: string中,然后您可以将其传递给std :: stringstream。
再一次,这只是一个例子而且不会完全按照你的意愿去做,你需要自己修改它以使它做你想做的事情!
#include <iostream>
#include <map>
#include <string>
#include <cmath>
#include <fstream>
// Global variables
std::map<std::string, int> wordcount;
unsigned int numcount;
void addEntry (std::string &entry) {
wordcount[entry]++;
numcount++;
return;
}
void returnCount () {
double percentage = numcount * 0.01;
percentage = floor(percentage + 0.5f);
std::map<std::string, int>::iterator Iter;
for (Iter = wordcount.begin(); Iter != wordcount.end(); ++Iter) {
if ((*Iter).second > percentage) {
std::cout << (*Iter).first << " used " << (*Iter).second << " times" << std::endl;
}
}
}
int main(int argc, char *argv[]) {
if (argc != 2) {
std::cerr << "Please call the program like follows: \n\t" << argv[0]
<< " <file name>" << std::endl;
return 1;
}
std::string data;
std::ifstream fileRead;
fileRead.open(argv[1]);
while (fileRead >> data) {
addEntry(data);
}
std::cout << "Total words in this file: " << numcount << std::endl;
std::cout << "Words that are 1% of the file: " << std::endl;
returnCount();
}
答案 4 :(得分:0)
如果您可以使用boost库,我建议使用boost::tokenizer:
boost Tokenizer包提供了一个 灵活易用的打破方式 一个字符串或其他字符 序列成一系列令牌。 下面是一个简单的例子 将一个短语分解为单词。
// simple_example_1.cpp #include<iostream> #include<boost/tokenizer.hpp> #include<string> int main(){ using namespace std; using namespace boost; string s = "This is, a test"; tokenizer<> tok(s); for(tokenizer<>::iterator beg=tok.begin();beg!=tok.end();++beg){ cout << *beg << "\n"; } }
答案 5 :(得分:0)
ifstream is {"my_file_path"};
vector<string> b {istream_iterator<string>{is},istream_iterator<string>{}};
别忘了包含这个:
<iterator>