【发布时间】:2016-08-06 22:40:16
【问题描述】:
大家好,我在执行这项任务时遇到了一些问题。我需要:
读取输入文件的每个单词。对于每个单词:
- 如果该词已存在于您的词库中,则只需将计数加 1。不要在您的清单中添加重复的单词。
- 如果您的单词清单中不存在该单词,请将其添加并将计数设置为 1。
- 读取所有输入文件后,关闭输入文件。
- 按 ASCII 字序对字库进行排序
- 显示单词库存,即列出单词及其计数。输出应按 ASCII 字序排序。
我允许的图书馆是iostream、iomanip、string、cstring、cerrno、limits、sstream、fstream、cmath。
到目前为止,我一直在数单词时遇到困难!我的代码计算字符,而不是单词。到目前为止我的代码如下:
#include "appl.h"
using namespace std;
/*
Class definition file for Appl
*/
string getFileName(ios_base::open_mode parm);
struct wordBlock {
string word;
int count;
};
// Constructor
Appl::Appl()
{
// id string is required for all CS 162 submissions. *** DO NOT CHANGE ***
_cs162_id_ = new string(__FILE__ + string(" compiled ")
+ __DATE__ + string(" ") + __TIME__
+ string(" using g++ ") + to_string(__GNUC__)
+ string(".") + to_string(__GNUC_MINOR__) + string(".")
+ to_string(__GNUC_PATCHLEVEL__));
}
// Destructor
Appl::~Appl()
{
delete _cs162_id_;
}
string inputFileName(ios_base::open_mode parm){
fstream iFile;
string inFileName = "";
int count = 1;
if(parm == ios::in){
while(count != 0){
cout << "Enter an input file name that exists: ";
getline(cin,inFileName);
iFile.open(inFileName.c_str() , ios::in);
if(iFile.good() != true){
cout << "?Invalid file name : file does not exist" <<
count++;
iFile.clear();
}else{
count = 0;
iFile.close();
return inFileName;
}
}
}
}
// Main Routine
int Appl::main(int argc, char ** argv)
{
fstream inFile;
string inFileNames;
inFileNames = inputFileName(ios::in);
inFile.open(inFileNames.c_str(), ios::in);
wordBlock inventory[1000];
if(inFile.is_open()){
for(auto idx = 0; idx < 1000; idx ++){
inventory[idx].word = idx;
inventory[idx].count = 0;
}
while(inFile.peek() != EOF) {
inventory[inFile.get()].count++;
}
for(auto idx = 0; idx < 1000; idx++){
inventory[idx].word = idx;
inventory[idx].count = 0;
}
while(inFile.peek() != EOF) {
inventory[inFile.get()].count++;
}
for(auto idx = 0; idx < 1000; idx++){
if(inventory[idx].count == 0) continue;
cout << "Word " << inventory[idx].word << " occurs " << inventory[idx].count << " times" << endl;
}
inFile.clear();
inFile.close();
}
return 0;
}
【问题讨论】:
-
首先你需要阅读this
istream::getreference。那么你也应该阅读"Why is iostream::eof inside a loop condition considered wrong?"。然后你需要重新思考你的设计,我建议你先把它写在某个地方,包括程序的要求、目标和目的,然后再考虑一下如何实现程序的目的。 -
相关:我在您的描述中没有看到关于确定“唯一”的不区分大小写。您可能需要重新阅读作业并澄清这些小细节,因为它可能会使这变得更加复杂。例如:单词“all”与“All”不是“等价”作为 ASCII 编码,但在字典中几乎是等价的。
-
对您可以使用或不可以使用的内容是否有任何限制? std::map 可以做任何事情,除了获取输入。
-
是的,有限制。这些是我允许的库:#include
#include #include #include #include #include #include #include #include -
感谢您迄今为止的所有帮助。 Joachim Pileborg 我明白你的意思!我认为我的 inFile.get() 不适合这种情况。
标签: c++