Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Парсинг строк


Автор: RA16 31.3.2016, 20:41
Прошу помочь составить программу. Нужно прочитать из файла строку символов. Данная строка состоит из нулей, единиц и пробелов. Группы нулей и единиц, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Требуется подсчитать и вывести количество слов в данной строке. Рассматривая слова как числа, определить и вывести количество слов, делящихся на 5 без остатка. Новую строку не создавать. Вывести исходную строку. 
У меня получился код, чтобы прочитать из файла строку символов. А какой код должен быть дальше ?

#include <iostream>
#include <fstream>
using namespace std;
char* getStringFromFile(const char* filename) throw (char*)
{
int len;
ifstream in(filename, ios::binary | ios::in);
if(!in) throw "Не возможно открыть файл";
if(!(len = in.seekg(0, ios::end).tellg())) throw "Пустой файл";
in.seekg(0, ios::beg);
char *buffer = new char[len + 1];
in.read(buffer, len);
buffer[len] = 0;
in.close();
return buffer;
} 

Автор: xvr 1.4.2016, 11:26
Цитата(RA16 @  31.3.2016,  20:41 Найти цитируемый пост)
У меня получился код, чтобы прочитать из файла строку символов.

Это недоразумение, а не код  smile 
Используйте std::string и istream& getline (istream& is, string& str); для чтения (если уж у вас С++)

Для разборки строки на ваши слова можно использовать регулярки (std::regex и std::regex_search из C++ 11)

Автор: RA16 1.4.2016, 12:53
К сожалению, пока на большее не претендую... Изучаю С++ 1-ую неделю. Не могли бы Вы написать, для примера, правильный код для этой задачи от начала до конца. У меня пока получилось только до стадии преобразования слова в число.
#include <iostream> 
#include <fstream> 
using namespace std;
char* getStringFromFile(const char* filename) throw (char*)
{
int len;
ifstream in(filename, ios::binary | ios::in); 
if(!in) throw "Не возможно открыть файл";
if(!(len = in.seekg(0, ios::end).tellg())) throw "Пустой файл"; 
in.seekg(0, ios::beg);
char *buffer = new char[len + 1]; 
in.read(buffer, len);
buffer[len] = 0; 
in.close(); 
return buffer;
}
#include <sstream>

stringstream sin;
sin.str(buffer);

// массив слов
vector<string> array;

// чтение слов
for(;;)
{
    string s;
    sin >> s;
    if (sin.eof()) break;
    array.push_back(s);
}

cout << "Количество слов = " << array.size();

Автор: xvr 1.4.2016, 23:33
Разбиение сделано правильно (даже проще, чем я предлагал).

Цитата(RA16 @  1.4.2016,  12:53 Найти цитируемый пост)
 Не могли бы Вы написать, для примера, правильный код для этой задачи от начала до конца.

От начала и до конца - это в центр помощи  smile Могу правильно написать то, что вы уже сделали:
Код

#include <iostream> 
#include <fstream>
#include <sstream>

using namespace std;

int main(int argc, char** argv)
{
  string s,input_line;
  vector<string> words;

  ifstream in(argv[1], ios::in);
  getline(in,input_line);
  stringstream sin(input_line);
  while(sin >> s) words.push_back(s);

...
}


Цитата(RA16 @  31.3.2016,  20:41 Найти цитируемый пост)
Рассматривая слова как числа, определить и вывести количество слов, делящихся на 5 без остатка.

Не совсем понятно - числа десятичные или двоичные? Если десятичные и состоящие только из 0 и 1, то делится на 5 будет только в том случае если последний символ в слове '0'. Как то подозрительно просто выглядит


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)