Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++,从文件中读取字母_C++_Arrays - Fatal编程技术网

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

C++,从文件中读取字母,c++,arrays,C++,Arrays,我有以下代码,但它只读取小写字母。理想情况下,它将读取大写和小写字母,然后将这些信息存储在一个数组中。欢迎提供任何帮助或建议 干杯。上面的代码有几个问题,但要直接回答您的问题,只需在增加信数之前进行某种检查即可 if ( letter >= 'a' ) letterCount[int(letter)-'a']++; else letterCount[int(letter)-'A']++; 重要: 这并不是将数组初始化为零,而是将第一项设置为零,然后将其余项设置为垃圾 int

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


干杯。

上面的代码有几个问题,但要直接回答您的问题,只需在增加信数之前进行某种检查即可

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

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

int letterCount[26] = {0}; 

要将整个数组设置为零,您必须使用for循环进行迭代,并将每个数组设置为0,手动键入它,如{0,0,26次…},或者使用memset一次清除所有数组。

可能与您手头的任务无关,但您可能会发现有趣的是,在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行代码。

是的,很抱歉忘记提到,如果输入文件不是由所有小写字母组成,那么该程序可能超出了字母计数的界限。还有,为什么letterCount[intletter-'a']++;在它自己的范围内?大写字母A是'65',小写字母A是'97',所以如果intletter-'A'是负数,请使用'65'@EmmanuelN:再试一次,你所说的与你的代码根本不匹配。此外,作用域是{}。为什么会这样?另外,如果不使用容器,至少在断言中包装数组访问;将所有元素设置为0。未指定值的元素是值初始化的还是默认初始化的?对于int来说,这两种方式都不重要,int的值是0。干杯,这几乎解决了我的问题,只是需要稍微调整一下。我相信这取决于你的编译器和编译器选项。我认为最好是慎重和安全。@ Altui NoPE,它是在C++标准中指定的。它不会因编译器而异。这是:int-letterCount[26];将是不好的,并用随机值填充,但int-letterCount[26]={};和int-letterCount[26]={0};将所有元素初始化为0。+1我发现这很有趣,尽管'b'>'A'和'b'>'C'。我想知道当用大写单词和非大写单词排序字符串时,这是如何起作用的。现在,这是我需要开始在脑海中敲打C++11可以做的事情之一。