Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ Builder] файлы, проблемы со строкой 
V
    Опции темы
Valentin07
Дата 19.4.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Дан текстовый файл, фразы в котором отделены друг от друга точками, а слова – пробелами и знаками препинания. Оставить в этом файле только те фразы, все слова в которых содержат букву «а».
написал вот такую штуку, должна работать, но зараза не хо4ет..=)))


Код

#include<conio.h>
#include<string.h>
#include<alloc.h>

int main()
{
FILE *f;
char *s=(char*)malloc(sizeof(char)*100),*s1=(char*)malloc(sizeof(char)*100);
char *s2=(char*)malloc(sizeof(char)*100),*s3=(char*)malloc(sizeof(char)*100),ch;
int b,i,j,k;

f=fopen("TEXTFOR1.txt","r");
fgets(s,strlen(s),f);
for (i=0;i<strlen(s);i++)
{
 if (*(s+i)=='.')
 {
  b=1;
  for (j=0;j<strlen(s1);j++)
  {
   if ((!j)||(*(s1+j)==' '))
   {
    sscanf(s1,"%s",s2);
    for (k=0;k<strlen(s2);k++)
    {
     if (*(s2+k)=='a')
     {
      break;
     }
     else
     {
      if (k==(strlen(s2)-1))
      {
       b=0;
      }
     }
     }}
     if (b==1) strcat(s3,s1);
     s1="";
    }}
   else
   {
    ch=*(s+i);
    strcat(s1,&ch);

   }
   }
   puts(s);
   puts(s2);
   puts(s3);



PM MAIL   Вверх
dizzy1984
Дата 19.4.2007, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



В чем выражается "неохота".
Опиши подробнее
PM MAIL   Вверх
betal
Дата 19.4.2007, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: 1
Всего: 1



типа у нас есть предложение
Цитата

Пойди погуляй, пашла пагуляла, и фсе.

и в конце получаем

Цитата

пашла пагуляла

Я правильно поял задание ?
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Dov
Дата 19.4.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(betal @  19.4.2007,  09:45 Найти цитируемый пост)
Я правильно поял задание ?

 smile 

Вот как нуна.
Цитата(Valentin07 @  19.4.2007,  00:32 Найти цитируемый пост)
Оставить в этом файле только те фразы, все слова в которых содержат букву «а».
  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Valentin07
Дата 19.4.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Да, именно. нужно фразы оставить.
Есть вот такая прога......она по4ти......но нужно ее доработать.....=)))
Она по4ему-то не хо4ет фразы оставлять.......=((((((((((

Код

#include <stdio.h>
#include <alloc.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>

FILE *fptr;
int i=0;
int main (void)
{
 clrscr();
 fptr=fopen("TEXTFOR1.txt","r");
 char *p; 
 char a;  
 char b [100];  
 char *ptr;  
 char *findstr="a"; 

 while (!feof(fptr))
 {
  a=getc(fptr);
 while ((a!='.')&&(!feof(fptr))) 
  {
    b[i]=a; i++;
    a=getc(fptr); 
  while ((a!=',')&&(a!=' ')&&(!feof(fptr))) 
  {
    b[i]=a; i++;
    a=getc(fptr); } 
     
b[i--]=0;  
  p=(char*)malloc(sizeof(b)); 
  strcpy(p,b);       
  ptr = strpbrk(p,findstr);  
   
  if (ptr) printf("%s ", p);
  i=0;
 }}   
 return 0;
}

PM MAIL   Вверх
dizzy1984
Дата 19.4.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Valentin07 @  19.4.2007,  11:30 Найти цитируемый пост)
Она по4ему-то не хо4ет

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

Код

#include "stdafx.h"
#include <fstream>
#include <iostream>

using namespace std;

#define INCOMINGFILENAME  "c:\\123.txt"
#define TEMPORARYFILENAME "c:\\321.txt"
#define WORDSSEPARATOR      " ,;:-()'\""
#define SENTENCESEPARATOR '.'
#define LETTERA           'а'

bool AllWordsInSentenceHasLetterA(const CString & sLine)
{
    int nIndex = 0;
    CString sCurToken;
    sCurToken = sLine.Tokenize(WORDSSEPARATOR, nIndex);    
    while (sCurToken != "")
    {
        if (sCurToken.Find(LETTERA) == -1) return false;
        sCurToken = sLine.Tokenize(WORDSSEPARATOR, nIndex);        
    }
    return true;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
...
else
{
         CString sLine;
    ifstream inc(INCOMINGFILENAME);
    ofstream outg(TEMPORARYFILENAME);
    inc.getline(sLine.GetBuffer(1024 * 16), 1024 * 16, SENTENCESEPARATOR);
    while (!inc.eof())
    {
        sLine.ReleaseBuffer();
        if (AllWordsInSentenceHasLetterA(sLine))
            outg<<sLine<<SENTENCESEPARATOR;
        inc.getline(sLine.GetBuffer(1024 * 16), 1024 * 16, SENTENCESEPARATOR);
    }
    inc.close();
    outg.close();
    ::CopyFile(TEMPORARYFILENAME, INCOMINGFILENAME, FALSE);
    ::DeleteFile(TEMPORARYFILENAME);
}


Пример
На входе 123.txt
маша пошла даше, так. паша ел траву ; синел . он(паша) сошел с ума. маша -
сошла. моя твоя. твая мая. счастья всем.
На выходе
маша пошла даше, так. маша -
сошла. твая мая.

Я опустил разнообразные проверки.
Так нет проверок на успешность открытия файлов, операцию копирования.


PM MAIL   Вверх
betal
Дата 19.4.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: 1
Всего: 1



Цитата(Dov @  19.4.2007,  11:03 Найти цитируемый пост)
Цитата(betal @  19.4.2007,  09:45 Найти цитируемый пост)
Я правильно поял задание ?

 smile 

Вот как нуна.
Цитата(Valentin07 @  19.4.2007,  00:32 Найти цитируемый пост)
Оставить в этом файле только те фразы, все слова в которых содержат букву «а».
  smile 

там там сказано фразы. Воть именно фрази а не слова....
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Dov
Дата 19.4.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(betal @  19.4.2007,  17:15 Найти цитируемый пост)
там там сказано фразы. Воть именно фрази а не слова....

betal, что бы правильно понять задание замени в нём слово 'фраза' на слово 'предложение'.  smile 

Ты всё поймёшь, ты всё увидишь сам.  smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Valentin07
Дата 19.4.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



а реально тоже самое в старом добром С написать?   Просто я так ни4его н понимаю.....=(((
PM MAIL   Вверх
dizzy1984
Дата 20.4.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Старого доброго (вот тут меня немного корежит если честно) Borland c++ 3.1 у меня сейчас нет под рукой. Как приду домой попробую это в нем скомпилировать. Пока же я переписал это как консольное приложение на vc++6.0 без mfc. Оно использет только стандартную библиотеку c++ и c run-time, так что по задумке и на старом добром  smile это должно пахать. 

Код

#include <fstream>
#include <iostream>

using namespace std;

#define INCOMINGFILENAME "c:\\123.txt"
#define TEMPORARYFILENAME "c:\\321.txt"
#define WORDSSEPARATOR " ,;:-()'\""
#define SENTENCESEPARATOR '.'
#define LETTERA 'а'

#define MAXSIMBSINSENTENCE 1024 * 16

bool AllWordsInSentenceHasLetterA(char * szSentence)
{
    char * szCurToken;
    szCurToken = strtok(szSentence, WORDSSEPARATOR); 
    while (szCurToken != NULL)
    {
        if (!strchr(szCurToken, LETTERA)) 
            return false;
        szCurToken = strtok(NULL, WORDSSEPARATOR); 
    }
    return true;
}

int main(int argc, char * argv[])
{
    char szSentence[MAXSIMBSINSENTENCE],
         szCopyOfSentence[MAXSIMBSINSENTENCE];

    ifstream inc(INCOMINGFILENAME);
    ofstream tmp(TEMPORARYFILENAME);
    inc.getline(szSentence, MAXSIMBSINSENTENCE, SENTENCESEPARATOR);
    while (!inc.eof())
    {
        strcpy(szCopyOfSentence, szSentence);
        if (AllWordsInSentenceHasLetterA(szCopyOfSentence))
            tmp<<szSentence<<SENTENCESEPARATOR;
        inc.getline(szSentence, 1024 * 16, SENTENCESEPARATOR);
    }
    inc.close();
    tmp.close();
    //::CopyFile(TEMPORARYFILENAME, INCOMINGFILENAME, FALSE);
    //::DeleteFile(TEMPORARYFILENAME);
    return 0;
}


Я совершенно забыл как в c run time удаление и копирование файла, напишите эти строчки.

PM MAIL   Вверх
Valentin07
Дата 20.4.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Просто этого мы еще не у4или...=)) А вто если бы максимально просто, используя только файлы, без наворотов.................................
PM MAIL   Вверх
Dov
Дата 21.4.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



На Си.  smile 

Код
#include <stdio.h>
#include <stdlib.h> 
#include <ctype.h>

int isOK(char* str)
{
    char* p;
    int   flag;

    p = str;
    while(*p)
    {
        while(*p && (isspace(*p) || ispunct(*p)))
            p++;

        flag = 0; 
        while(*p && !isspace(*p) && !ispunct(*p))
            if(*p++ == 'a') 
                flag = 1;
        if(!flag)
            return 0;        
    }
             
    return 1;
}

int main(int argc, char* argv[])
{
    char  buffer[255];     
    char  sentence[255] = "";
    char* p;
    int   i;
    FILE* file;

    if((file = fopen("test.txt", "r")) == NULL)
        puts("Unable to open file.."), exit(1);

    fgets(buffer, 255, file);
    fclose(file);

    if((file = fopen("test.txt", "w")) == NULL)
        puts("Unable to open file.."), exit(1);
    
    for(p = buffer; *p; p++)
    {        
        for(i = 0; *p && *p != '.'; i++, p++)
            sentence[i] = *p;

        if(isOK(sentence))
        {
            printf("%s.", sentence);
            fprintf(file, "%s.", sentence);
        }
    }
    puts("");
    fclose(file);

    return 0;    
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Valentin07
Дата 21.4.2007, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Спасибо огромное, ребят! Выру4или!!!!!
PM MAIL   Вверх
Valentin07
Дата 21.4.2007, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Ура!

Добавлено через 28 секунд
Ура!
PM MAIL   Вверх
dizzy1984
Дата 21.4.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Я, кажется, припозднился  smile 
На счет наворотов я так понял, что это было сказано про потоки, функции работы со строками я все же оставил.

Вот мое решение на си. компилировал на tc++3.0

Код

#include <stdio.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>

#define INCOMINGFILENAME  "c:\\123.txt"
#define TEMPORARYFILENAME "c:\\321.txt"
#define WORDSSEPARATOR    " ,;:-()'\"\n"
#define SENTENCESEPARATOR '.'
#define LETTERA           'а'
#define MAXSIMBSINSENTENCE 1024 * 16

#define bool char
#define true  1
#define false 0

bool AllWordsInSentenceHasLetterA(char * szSentence)
{
    char * szCurToken;
    szCurToken = strtok(szSentence, WORDSSEPARATOR);
    while (szCurToken != NULL)
    {
    if (!strchr(szCurToken, LETTERA))
        return false;
    szCurToken = strtok(NULL, WORDSSEPARATOR);
    }
    return true;
}

void getline(int hFileHandle, char * szBuffer, char cDelimiter)
{

    int i = 0;
    read(hFileHandle, szBuffer + i, sizeof(char));
    while (!eof(hFileHandle) && szBuffer[i]!=cDelimiter)
    {
        ++i;
        read(hFileHandle, szBuffer + i, sizeof(char));
    }
    szBuffer[i] = '\0';
};

void main()
{
    char szSentence[MAXSIMBSINSENTENCE],
         szCopyOfSentence[MAXSIMBSINSENTENCE];
    int hInc = open(INCOMINGFILENAME,  O_RDONLY),
        hTmp = open(TEMPORARYFILENAME, O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);

    while (!eof(hInc))
    {
        getline(hInc, szSentence, SENTENCESEPARATOR);
        strcpy(szCopyOfSentence, szSentence);
        if (AllWordsInSentenceHasLetterA(szCopyOfSentence))
        {
            int nLen = strlen(szSentence);
            szSentence[nLen] = SENTENCESEPARATOR;
            szSentence[nLen + 1] = '\0';
            write(hTmp, szSentence, strlen(szSentence));
        }
    }
    close(hInc);
    close(hTmp);

    remove(INCOMINGFILENAME);
    rename(TEMPORARYFILENAME, INCOMINGFILENAME);
}


а вот решение на c++, которое компилируется на tc++3.0
Код

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

//using namespace std;

#define INCOMINGFILENAME "c:\\123.txt"
#define TEMPORARYFILENAME "c:\\321.txt"
#define WORDSSEPARATOR " ,;:-()'\""
#define SENTENCESEPARATOR '.'
#define LETTERA 'а'
#define MAXSIMBSINSENTENCE 1024 * 16

#define bool char
#define true  1
#define false 0

bool AllWordsInSentenceHasLetterA(char * szSentence)
{
    char * szCurToken;
    szCurToken = strtok(szSentence, WORDSSEPARATOR);
    while (szCurToken != NULL)
    {
    if (!strchr(szCurToken, LETTERA))
        return false;
    szCurToken = strtok(NULL, WORDSSEPARATOR);
    }
    return true;
}

void main()
{
    char szSentence[MAXSIMBSINSENTENCE],
         szCopyOfSentence[MAXSIMBSINSENTENCE];
    ifstream inc(INCOMINGFILENAME);
    ofstream tmp(TEMPORARYFILENAME);
    inc.getline(szSentence, MAXSIMBSINSENTENCE, SENTENCESEPARATOR);
    while (!inc.eof())
    {
        strcpy(szCopyOfSentence, szSentence);
        if (AllWordsInSentenceHasLetterA(szCopyOfSentence))
            tmp<<szSentence<<SENTENCESEPARATOR;
        inc.getline(szSentence, MAXSIMBSINSENTENCE, SENTENCESEPARATOR);
    }
    inc.close();
    tmp.close();

    remove(INCOMINGFILENAME);
    rename(TEMPORARYFILENAME, INCOMINGFILENAME);
}


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.