c++ 计算文本文件中整数个数的函数?

hgb9j2n6  于 2022-12-15  发布在  其他
关注(0)|答案(3)|浏览(150)

我只需要写一个函数来计算一个已经打开的好的文本文件中的整数个数。
a.假设有一个文本文件,其中包含大量的整数并被空格分隔
B.编写一个名为analyzeFile的函数,该函数接受先前打开的ifstream文件对象作为参数,并计算文件中的整数数量。
c.它不需要对整数做任何事情,但是它必须精确地计算文件中整数的正确数目,并将该数目返回给调用函数。
d.它也不需要操纵文件操作本身,因此它不需要关闭文件或进行任何其他动作,除了计数整数并返回它们的数目。
谢谢你在我的问题上的任何帮助!

**编辑:**以下是我作为函数所做的工作,是否正确,我不知道:

int analizeFile (ifstream &inf, const string &fileName) { 
   int count = 1; 
   int num; 
   fin.open(fileName.c_str() ); 
   fin >> num; 
   while (fin.good() ) { 
      fin>> num; 
      count ++; 
   } 
   return count;
}
kgqe7b3p

kgqe7b3p1#

备注:

int analizeFile (ifstream &inf, const string &fileName) {

由于计数总是一个非负的量,我更喜欢使用size_t而不是int. Nit:您可能需要将函数的名称更改为analyzeFile

int count = 1;

问题从这里开始:如果文件中没有任何整数,则返回错误的结果。

int num; 
   fin.open(fileName.c_str() );

不需要调用open。这通常由ifstream ctor调用。

fin >> num; 
   while (fin.good() ) {

同样,这不是必需的,您可以从流中提取并在while条件下测试--这是更常用的条件。

fin>> num; 
  count ++; 
   } 
   return count;
}
5t7ly7z5

5t7ly7z52#

您也可以使用函数方法

// it was previously opened, so you don't need a filename. 
int analyzeFile (istream &inf) { 
   std::istream_iterator<int> b(inf), e;
   return std::distance(b, e);
}

如果迭代器不能读取整数,它将在流上设置失败状态,并与结束迭代器进行比较。distance然后返回到达结束迭代器所用的迭代步数。

vd8tlhqk

vd8tlhqk3#

很多很多年后,你可以想出一个更现代的解决方案。
您可以简单地使用std__mapstd::unordered:map等关联容器进行计数,这或多或少是标准方法。
然后有许多许多新的和强大的功能可用。
利用这些,你可以得出一些类似的结论:

#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
#include <map>
#include <cctype>

using Counter = std::map<char, std::size_t>;

const std::string fileName{"test.txt"};

int main() {
    // Open file and check, if it could be opened
    if (std::ifstream ifs{fileName}; ifs) {
        
        // Read all data 
        std::string text{std::istream_iterator<char>(ifs),{}};
        
        // Define the counters
        Counter upperCaseLettterCount{},lowerCaseLettterCount{};
        
        // Iterate over all characters in the string and count
        for (const char c : text) {
            if (std::isupper(c)) upperCaseLettterCount[c]++;
            if (std::islower(c)) lowerCaseLettterCount[c]++;
        }
        
        // Show result
        std::cout << "\nUppercase count:\n\n";
        for (const auto& [letter,count] : upperCaseLettterCount) std::cout << letter << " -> " << count << '\n';
        std::cout << "\nLowercase count:\n\n";
        for (const auto& [letter,count] : lowerCaseLettterCount) std::cout << letter << " -> " << count << '\n';
    }
    else
        // Error, file could not be opened
        std::cerr << "\n\n*** Error: Text file '" << fileName << "' could not be opened\n\n";
}

相关问题