C ++,从文件中读取字母

时间:2011-12-14 19:34:05

标签: c++ arrays

我有以下代码,但它只读取小写字母。理想情况下,它会读取大写和小写字母,然后将此信息存储在数组中。欢迎任何帮助或建议。

干杯。

2 个答案:

答案 0 :(得分:2)

上面的代码有几个问题但是直接回答你的问题,只需在增加letterCount之前做一些检查

if ( letter >= 'a' )
   letterCount[int(letter)-'a']++;
else
   letterCount[int(letter)-'A']++;

重要提示:

这不是将数组初始化为零,它只是将第一项设置为零,然后其余为垃圾。

int letterCount[26] = {0}; 

要将整个数组设置为零,您必须使用for循环进行迭代并将每个数组设置为0,手动将其键入为{0,0,0,26次...},或使用memset()马上清除它。

答案 1 :(得分:0)

可能与您手头的任务无关,但您可能会发现有趣的是,在C ++ 11中,您可以使用更少的代码执行相同的操作:

#include <map>
#include <iterator>
#include <fstream>
#include <algorithm>
#include <cctype>

int main(int /*argc*/, char* /*argv*/[])
{
    std::map<char,int> counts;
    std::ifstream test("test.txt");
    if( test ) {
        std::for_each(std::istreambuf_iterator<char>(test),
                      std::istreambuf_iterator<char>(),
                      [&counts](char c) { if( std::isalpha(c) ) ++counts[c]; });
    }
}

上面的代码填写地图而不是矢量。在这种情况下,对于特定字母,地图比矢量更慢。您可以使用向量而不是地图,但这会添加更多后台处理代码,这些代码与任务无关。如果必须的话,我很可能只是将地图复制到矢量中。

在之前的标准中,你仍然可以完成同样的事情,只有你用函数对象替换lambda函数。这可能会增加3行代码。