读取文件,但打印不在读取文件中的整数

Reads a file but prints integers that are not in the read file

本文关键字:读取 文件 整数 打印      更新时间:2023-10-16

我无法读取一个文件,然后将列表打印到另一个文件,逐行列出每个文件的出现次数。

我可以工作,但是它将数字: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);
}