Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Строки класса String

Автор: arhDMC 19.12.2007 2:40

Здравствуйте помогите пожалуйста с задачами:
1) Написать программу, которая считывает текст из файла и выводит на экран только вопросительные предложения из этого текста.

#include "stdafx.h"
#include <fstream>
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
bool isLimit(char c)
{
char lim[]={' ','\t','\n'};
for (int i=0;i<sizeof(lim);++i)
if(c==lim[i])return true;return false;}

int _tmain(int argc, _TCHAR* argv[])
{
ifstream fin("infile.txt",ios::in|ios::nocreate);
if (!fin)
{
cout<<"oshibka otkritiy faila";
return 1;
}
int count=0; string word;
ostringstream sentence;
while(!fin.eof()){
char symb;
while(isLimit(symb=fin.peek()))
{
sentence<<symb;
if(symb=='\n')break;
fin.seekg(1,ios::cur);
}
fin>>word;
sentence<<word;
char last=word[word.size()-1];
if((last=='.')||(last=='!'))
{
sentence.str("");
continue;
}
if(last=='?')
{
cout<<sentence.str();
sentence.str("");
count++;
}
}
if(!count)cout<<"Voprositelnix predlozenii net";
return 0;
}


Две ошибки при компиляции: error C2039: '_Nocreate' : is not a member of 'basic_ios<char,struct std::char_traits<char> >' и error C2065: '_Nocreate' : undeclared identifier
2) Написать программу, формирующую из заданного текстового файла словарь, т.е. текстовый файл, содержащий все слова исходного файла
#include <fstream.h>
#include <iostream.h>
#include <string.h>
#include <stdlib.h>

int main(){
int const length=31;
struct Word{
char word[length];
};
char curword[length];

ifstream fin("example.txt", ios::in|ios::nocreate);
if(!fin){cout<<"ERROR"<<endl; return 1;}

int l=10000;
char *zuf=new char[l];
ofstream out("out.txt",ios::out|ios::nocreate);
if(!out){cout<<"ERROR"<<endl; return 2;}

int const more=1000000;
Word w2[more];
int i=0;
while(!fin.eof()){
if (i>more){cout<<"It is too long file!!! "<<endl;return 3;}
fin>>curword;
i++;
}

for(int g=0;g<i;g++)
for(int k=g;k<i;k++){
if(strcmp(w2[g].word, w2[k].word) > 0){
Word buf=w2[k];
w2[k]=w2[g];
w2[g]=buf;
}
}
int n=0;
while (n<i){
out<<w2[n].word;
n++;
}



return 0;
}


Эта компилируется но не работает

Автор: volvo 19.12.2007 3:00

Цитата
Две ошибки при компиляции: error C2039: '_Nocreate' : is not a member of 'basic_ios<char,struct std::char_traits<char> >' и error C2065: '_Nocreate' : undeclared identifier
Ошибка на самом деле одна, вторая - наведенная... Дело в том, что флаги ios::nocreate теперь не описаны в <fstream>, поскольку они слишком платформо-зависимы...

Да и вообще я не вижу смысла использовать флаг nocreate при открытии файла на чтение. При ios::out смысл есть, но не при ios::in.

P.S. Программка-то кстати, (первая) тоже не работает...

Автор: arhDMC 19.12.2007 5:04

а как сделать? smile.gif

Автор: volvo 19.12.2007 5:09

"Как сделать" что? Открытие файла? Или программу? smile.gif Файл открывается просто так:

ifstream fin("example.txt", ios::in);


А насчет программы... Тебе обязательно использовать stringstream? Или можно ограничиться только использованием string-ов?

Автор: arhDMC 19.12.2007 5:18

Програмку smile.gif не мне в программе главное чтобы класс String присутствовал и все.

Автор: arhDMC 19.12.2007 5:43

ай все понял smile.gif спасибо
а вот тут с ios::out как сделать?

#include <fstream.h>
#include <iostream.h>
#include <string.h>

int main(){
int const length=31;
struct Word{
char word[length];
};
char curword[length];

ifstream fin("example.txt", ios::in|ios::nocreate);
if(!fin){cout<<"ERROR"<<endl; return 1;}

int l=10000;
char *zuf=new char[l];
ofstream out("out.txt",ios::out|ios::nocreate);
if(!out){cout<<"ERROR"<<endl; return 2;}

int const more=1000000;
Word w2[more];
int i=0;
while(!fin.eof()){
if (i>more){cout<<"It is too long file!!! "<<endl;return 3;}
fin>>curword;
i++;
}

for(int g=0;g<i;g++)
for(int k=g;k<i;k++){
if(strcmp(w2[g].word, w2[k].word) > 0){
Word buf=w2[k];
w2[k]=w2[g];
w2[g]=buf;
}
}
int n=0;
while (n<i){
out<<w2[n].word;
n++;
}



return 0;
}

там ошибка почему-то выскакивает и не записывается ничего в файл out.txt а компилируется нормально

Автор: volvo 19.12.2007 6:26

Цитата
ай все понял
blink.gif Зато я ничего не понял...

Вот так можно сделать первую программу:
#include <string>
#include <iostream>
#include <fstream>

using namespace std;

int main() {
ifstream fin("infile.txt", ios::in);

string str;
string all_text = "";
while(!fin.eof()) {
getline(fin, str);
all_text += str;
}

string sentence;
int count = 0, next = 0;
while(all_text.length() > 0) {
sentence = all_text.substr(0, (next = (all_text.find_first_of(".!?") + 1)));
all_text = all_text.substr(next);
if(sentence[sentence.length() - 1] == '?') {
cout << sentence << endl;
count += 1;
}
}
if(!count) {
cout << "no questions" << endl;
}
return 0;
}


Автор: arhDMC 19.12.2007 11:49

Я с первой-то понял. А со второй?

Автор: volvo 19.12.2007 14:19

Цитата
А со второй?
Со второй - совсем просто: читаешь все слова из входного потока в std::vector<string>, потом удаляешь из него дубликаты: сначала sort, потом - unique_copy в другой вектор или сразу в выходной поток...

Автор: arhDMC 23.12.2007 3:34

не совсем понял а в коде это как и куда записать?

Автор: volvo 23.12.2007 4:29

Цитата
а в коде это как
А в коде это вот так:

#include <string>
#include <vector>
#include <iostream>
#include <iterator>
#include <fstream>

using namespace std;

void split_string(const std::string& str, vector<string>& v,
const std::string& delim = ",")
{
std::string::size_type lpos = 0;
std::string::size_type pos = str.find_first_of(delim, lpos);
do
{
string s = str.substr(lpos, pos - lpos);
if(!s.empty()) {
v.push_back(s);
}
lpos = ( pos == std::string::npos ) ? std::string::npos : pos + 1;
pos = str.find_first_of(delim, lpos);
}
while(lpos != std::string::npos);
}

int main() {
ifstream fin("infile.txt", ios::in);

ofstream fout("outfile.txt", ios::out);
ostream_iterator<string> out_it(fout, "\n" );

string s;
vector<string> buffer;

while(!fin.eof()) {
getline(fin, s); // читаем очередную строку из файла
split_string(s, buffer, ".,:?! "); // разбиваем ее на слова и заносим их в buffer
}
fin.close();

sort(buffer.begin(), buffer.end()); // сортируем слова по алфавиту

// копируем в выходной файл с удалением дубликатов
unique_copy(buffer.begin(), buffer.end(), out_it);
fout.close();

return 0;
}

yes2.gif

Автор: arhDMC 23.12.2007 4:50

спасибо