读取文件,但打印不在读取文件中的整数
Reads a file but prints integers that are not in the read file
我无法读取一个文件,然后将列表打印到另一个文件,逐行列出每个文件的出现次数。
我可以工作,但是它将数字:1、2、3、4 和 5 打印到输出
文件中,这些数字不在读取文件中结构:
struct entry {
string word;
string word_uppercase;
int number_occurences;
};
//for array
entry myEntryArray[MAX_WORDS];
int addNewEntryHere=0; //next empty slot
我的主要调用 extractTokensFromLine 来读取并放入数组:
void extractTokensFromLine(std::string &myString) {
const char CHAR_TO_SEARCH_FOR = ' ';
stringstream ss(myString);
string tempToken;
//Extracts characters from is and stores them into str until the delimitation character delim is found
while (getline(ss, tempToken, CHAR_TO_SEARCH_FOR)) {
processTokenArray(tempToken);
}
}
它逐字逐句地遍历每一行以放入数组中:
void processTokenArray(string &token) {
//temp uppercase for compare
string strUpper = token;
toUpper(strUpper);
//see if its already there
for (int i = 0; i < addNewEntryHere; ++i) {
if (strUpper == myEntryArray[i].word_uppercase) {
//yep increment count
myEntryArray[i].number_occurences++;
return;
}
}
//nope add it
myEntryArray[addNewEntryHere].word = token;
myEntryArray[addNewEntryHere].number_occurences = 1;
myEntryArray[addNewEntryHere].word_uppercase = strUpper;
//where next place to add is
addNewEntryHere++;
}
然后,它将数组写入文件(每个单词及其出现次数(:
bool writeArraytoFile(const std::string &OUTPUTFILENAME) {
fstream outfile;
if (!openFile(outfile,OUTPUTFILENAME,ios_base::out))
return false;
int var;
for (var = 0; var < addNewEntryHere; ++var) {
string word = myEntryArray[var].word;
if(word != " " && word != "")
outfile<<myEntryArray[var].word << " " <<IntToString(myEntryArray[var].number_occurences)<<std::endl;
}
closeFile(outfile);
return true;
}
读取文件是测试数据.txt:
我想我应该喜欢一点黄油
如果不是
太麻烦了一些吐司。当你在厨房里时,为我和我的男人在这里提供一堆快递。
我的输出文件(使用以下方法排序(:
void sortVector(sortOrder so = NUMBER_OCCURRENCES) {
bool shouldSwap = false;
for (int var = 0; var < addNewEntryHereV; ++var) {
for (int var1 = var+1; var1 < addNewEntryHereV; ++var1) {
switch (so) {
case ASCENDING:
shouldSwap =!compareAscendingV(myEntryVector, var, var1);
break;
//TODO handle the following cases appropriately
case DESCENDING:
shouldSwap =!compareDescendingV(myEntryVector, var, var1);
break;
case NUMBER_OCCURRENCES:
shouldSwap =!sortbyOccurrenceV(myEntryVector, var, var1);
break;
default:
break;
}
if (shouldSwap){
std::string tmp = myEntryVector._V.at(var);
myEntryVector._V.at(var) = myEntryVector._V.at(var1);
myEntryVector._V.at(var1) = tmp;
}
}
}
}
实际输出:
和 3
4 2
的 2
一 2
I 2
这里。
1人 1
我的 1
我 1
对于 1
快线 1
大括号 1
厨房 1
的 1
合 1
为 1
你 1
而 1
井。
1作为 1
吐司 1
一些 1
麻烦 1
很多 1
太 1
5 1
3 1
2 1
1 1
不是 1
其 1
如果 1
黄油 1
位 1
赞 1
应该 1
思考 1
任何建议将不胜感激,谢谢
在某些情况下,我的规格我不清楚,所以我猜到了。这应该非常接近您要做的事情。
gcc 4.7.3: g++ -Wall -Wextra -std=c++0x word-freq.cpp
#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
typedef std::map<std::string, int> histogram_t;
std::string to_lower(const std::string& s) {
std::string r(s);
std::transform(std::begin(r), std::end(r), std::begin(r), ::tolower);
return r; }
histogram_t word_freq(std::istream& is) {
histogram_t m;
std::string s;
while (is >> s) { ++m[to_lower(s)]; }
return m; }
void outAscWord(std::ostream& os, const histogram_t& m) {
for (const auto& e : m) {
os << e.first << " " << e.second << "n"; } }
void outDescWord(std::ostream& os, const histogram_t& m) {
for (auto i = m.crbegin(); i != m.crend(); ++i) {
os << i->first << " " << i->second << "n"; } }
template <class A, class B>
std::pair<B, A> flip_pair(const std::pair<A, B>& p) {
return std::pair<B, A>(p.second, p.first); }
template <class A, class B>
std::multimap<B, A> flip_map(const std::map<A, B>& m) {
std::multimap<B, A> r;
std::transform(m.begin(), m.end(), std::inserter(r, r.begin()), flip_pair<A,B>);
return r; }
void outAscCount(std::ostream& os, const histogram_t& m) {
auto mm = flip_map(m);
for (const auto& e : mm) {
os << e.first << " " << e.second << "n"; } }
int main() {
// Can pass fstreams instead of iostreams if desired.
auto m = word_freq(std::cin);
outAscWord(std::cout, m);
outDescWord(std::cout, m);
outAscCount(std::cout, m);
}
相关文章:
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在读取文件大小时文件IO速度会发生变化
- 读取文件时运行时的未知行为
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C++ 读取文件读取文件不正确
- 读取文件并将其存储在unordered_map中时出现问题
- 读取文件时无法使用 OpenMP 获得加速
- 使用istringstearm和get行缓慢读取文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 读取文件时引发异常
- 从标准输入读取文件后读取用户输入
- 在读取文件后重置句柄
- 如何在C++编译时读取文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 读取文件在第二次调用时返回INVALID_HANDLE
- 通过指针读取文件
- 逐行读取文件,并将数据插入变量和数组中