Обнаружение пространства в файле в C ++ - PullRequest
1 голос
/ 18 марта 2012

Привет, мне просто интересно, может ли кто-нибудь помочь мне, я читаю символы из файла, затем вставляю их в карту, у меня работает код, я просто хотел узнать, как мне определить, есть ли в файле пробел, потому что мне нужно сохранить количество раз, когда в файле встречается пробел, любая помощь будет большой благодарностью.

map<char, int> treeNodes; //character and the frequency
ifstream text("test.txt");

while(!text.eof())
{
    text >> characters;
    //getline(text,characters);
    cout << characters;
    if(treeNodes.count(characters) == 0)
    {
        if(isspace (characters))
        {
            cout << "space" << endl;
        }
        else
            treeNodes.insert(pair<char,int>(characters,1));
    }
    else
    {
        treeNodes[characters] += 1;
    }
}

Ответы [ 3 ]

2 голосов
/ 18 марта 2012

Форматированный ввод, т. Е. При использовании сдвига вправо operator>>() по умолчанию пропускает первые пробелы.Вы можете отключить это, используя std::noskipws, но в зависимости от того, какие вещи вы хотите прочитать, это не будет очень приятным опытом.Наилучшим подходом, вероятно, является использование неформатированного ввода, то есть что-то вроде std::getline() и разделение строки на пробел в программе.

Если вы просто хотите посчитать, сколько раз встречался какой-либо конкретный символ, вы, вероятно, захотитеиспользуйте std::istreambuf_iterator<char> и просто перебирайте содержимое потока (этот код также пропускает некоторые другие ненужные помехи):

for (std::istreambuf_iterator<char> it(text), end(); it != end; ++it) {
    ++treeNodes[*it];
}

Кстати, вы никогда не хотите использовать результат eof() для чего-то иного, чем определение, было ли последнее чтение неудачным, потому что поток достиг своего конца.

0 голосов
/ 18 марта 2012

Я действительно не знаю, как это сделать на чистом C ++, но именно так это и делается на C

#include <stdio.h>

int main()
{
    FILE *in = fopen("input.txt","r");

    string x;
    int count;

    for(int i=0;;i++)
    {
        fscanf(in,"%s",x);

        if(x!='\0') //try " " if that didn't work
        {
            for(int i=0;i<x.size();i++)
            {
                if(x[i]==' ') //try " " if that didn't work
                {
                    count++;
                }
            }
        }
        else
        {
            break;
        }
    }
}

Это точно не сработает. Оставьте комментарий, если у вас есть проблемы с ним:)

0 голосов
/ 18 марта 2012

не могли бы вы просто привести тип к int и проверить, равно ли оно значению ascii для пробела?

...