Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Нужно убрать текстовую часть из файла (https://forum.antichat.xyz/showthread.php?t=77504)

.Sylar 17.07.2008 20:50

Нужно убрать текстовую часть из файла
 
Есть файл, в котором хранятся записи вида A:1:2:3.33:4:5
Причём каждая новая запись с новой строчки :)

Где

А-текст
1,2,4,5 - целые числа. Причём число 5 может достигать нескольких десятков тысяч.
3.33 - дробное число.

Нужно написать прогу, чтоб она убирала текстовую часть (т.е. А). Объясняю как это нужно делать. Пройтись от числа 5 до двоеточия, которое стоит перед первым числом (1). Т.е. просто считать двоеточия, проходя каждую строчку и когда их станет 5(пять) нужно остановиться. Записать результат нужно в новый файл.

Т.е. поясню ещё раз -

input.txt
Цитата:

Сообщение от input.txt
la:la13:11:133:0.00:7:10288
bla!b13:0:1008:0.87:0:13154

output.txt
Цитата:

Сообщение от output.txt
11:133:0.00:7:10288
0:1008:0.87:0:13154

Спасибо за помощь,
ЗЫ. название темы получше придумать не смог :/

_antony 17.07.2008 21:07

Цитата:

Объясняю как это нужно делать. Пройтись от числа 5 до двоеточия, которое стоит перед первым числом (1). Т.е. просто считать двоеточия, проходя каждую строчку и когда их станет 5(пять) нужно остановиться.
не проше через strtok() разбить строку? :)
просто шас под рукой нет компилятора , а так вот набросал :
Код:


#include<stdio.h>
#include<string.h>
int main(int argc , char *argv[])
{
        char src[] = "text:123:15:17:20:30:5";
        char *pch;
        FILE *fp;
        fp = fopen("test.txt" , "w+");
        if(fp == NULL)
        {
                return -1;
        }
        pch = strtok(src , ":");
        while(true)
        {     
                pch = strtok(NULL , ":");
                if(pch == NULL)
                {
                        break;
                }
                fputs(pch , fp);
            fputs(":" , fp);
        }
        fclose(fp);
        return 0;
}

файл должен содержать 123:15:17:20:30:5:
чего-то ступил лучше fprintf использовать
Код:

fprintf(fp , ":%s" , pch);

Delimiter 17.07.2008 22:33

дафайте и я набросаю 8)

Бил прямо тут так что извиняй за ошибки если что 8)))

...но идея должна быть понятна!
Функция h_f вытаскивает подстроку по ее номеру где определена строка делимитеров(разделителей)

Код:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int h_f(char *sourcestr,char *deststr,int nelement,char *delimiterStr,int mode)
{
        int i;
        int mcnt;
        char tstr[300];
        int flrez=0;
        int pstr=0;
        int prepfl;
                *(deststr)=0;
    if(strchr(delimiterStr,*(sourcestr))!=0)
                prepfl=0;
        else
                prepfl=1;
    for(i=0,mcnt=1,flrez=0,prepfl=0;*(sourcestr+i)!=0;i++)
        {
                if(strchr(delimiterStr,*(sourcestr+i))!=NULL)
                {
              if(mode==0)
                          {
                  if(prepfl!=0)
                                  {
                                    if(mcnt<=nelement)
                                      mcnt++;
                                    else
                                          break;
                                  }
                  prepfl=0;
                          }
                          else
                          {
                                    if(mcnt<=nelement)
                                      mcnt++;
                                    else
                                                {
                                                        flrez=1;
                                          break;
                                                }
                          }
                }
                else
                {
          if(mcnt==nelement)
                  {
                          *(deststr+pstr)=*(sourcestr+i);
                                  pstr++;
                                  flrez=1;
                  }
          prepfl=1;
                }
        }
        *(deststr+pstr)=0;
return flrez;
}

int main()
{
  FILE *f1,*f2;
  char tstr[200];
  char dstr[50];
  int ind=0;
  int i,j,fl,z;
  if((f1=fopen("input.txt","rt"))!=0)
  {
    if((f2=fopen("output.txt","w+b"))!=0)
    {
        do {
              fgets(tstr,49,f1);
              for(i=1,z=0;h_f(tstr,dstr,i,":\r\n",1)==1;i++) // ИЗМЕНЕНО
            {
                for(j=0,fl=0;*(dstr+j)!=0 && fl==0;j++)
                  if(!(*(dstr+j)>='0' && *(dstr+j)<='9'))
                      if(!(*(dstr+j)=='.'))
                        fl=1;
                if(fl==0)
                {
                  if(z>0)
                    fprintf(f2,":");
                  else
                    z++;
                  fprintf(f2,"%s",dstr);
                }
            }
            fprintf(f2,"\r\n");
        } while(!feof(f1)) ;
        fclose(f2);
    }
    fclose(f1);
  }
  return 0;
}


.Sylar 17.07.2008 23:41

Ни то, ни другое не работает :) Скачал я с торента Borland 3.1

у delimiter'a ругается на 'eof'

Цитата:

error noname00.cpp 88: Function 'eof' should have a prototype
у _antony на 'true'

Цитата:

Error noname00.cpp 14: Undefined symbol 'true'

_antony 18.07.2008 00:01

вместо true можно единицу поставить)

Delimiter 18.07.2008 00:07

изменил на feof :D

.Sylar 18.07.2008 00:27

Delimiter,

эээ чё-бы там исправить, чтобы работало для A:1:2:3:4.44:5:6 ? :)

Delimiter 18.07.2008 00:42

проверил все работает
(mfc проект)
Код:

int h_f(char *sourcestr,char *deststr,int nelement,char *delimiterStr,int mode)
{
        int i;
        int mcnt;
        char tstr[300];
        int flrez=0;
        int pstr=0;
        int prepfl;
        *(deststr)=0;
        if(strchr(delimiterStr,*(sourcestr))!=0)
                prepfl=0;
        else
                prepfl=1;
    for(i=0,mcnt=1,flrez=0,prepfl=0;*(sourcestr+i)!=0;i++)
        {
                if(strchr(delimiterStr,*(sourcestr+i))!=NULL)
                {
                        if(mode==0)
                        {
                                if(prepfl!=0)
                                {
                                        if(mcnt<=nelement)
                                                mcnt++;
                                        else
                                                break;
                                }
                                prepfl=0;
                        }
                        else
                        {
                                if(mcnt<=nelement)
                                        mcnt++;
                                else
                                {
                                        flrez=1;
                                        break;
                                }
                        }
                }
                else
                {
                        if(mcnt==nelement)
                        {
                                *(deststr+pstr)=*(sourcestr+i);
                                pstr++;
                                flrez=1;
                        }
                        prepfl=1;
                }
        }
        *(deststr+pstr)=0;
        return flrez;
}
void CSsDlg::OnButton1()
{
        // TODO: Add your control notification handler code here
        FILE *f1,*f2;
        char tstr[200];
        char dstr[50];
        int ind=0;
        int i,j,fl,z;
        if((f1=fopen("input.txt","rt"))!=0)
        {
                if((f2=fopen("output.txt","w+b"))!=0)
                {
                        do {
                          if(fgets(tstr,49,f1)>0)
                          {

                               
                                for(i=1,z=0;h_f(tstr,dstr,i,":\r\n",1)==1;i++)  //ИЗМЕНЕНО!
                                {
                                        for(j=0,fl=0;*(dstr+j)!=0 && fl==0;j++)
                                                if(!(*(dstr+j)>='0' && *(dstr+j)<='9'))
                                                        if(!(*(dstr+j)=='.'))
                                                                fl=1;
                                                        if(fl==0)
                                                        {
                                                                if(z>0)
                                                                        fprintf(f2,":");
                                                                else
                                                                        z++;
                                                                fprintf(f2,"%s",dstr);
                                                        }
                                }
                          }
                                fprintf(f2,"\r\n");
                        } while(!feof(f1)) ;
                        fclose(f2);
                }
                fclose(f1);
  }       
}

Input.txt
Код:

A:1:2:3:4.44:5:6
Output.txt
Код:

1:2:3:4.44:5:6

Irdis 18.07.2008 18:25

ууу... жесть какая...
а не проще было бы считать фаил посимвольно в массив
и сравнить по кодам отдельно взятых символов

Delimiter 19.07.2008 00:35

а в чем упрощение
Алгоритм
1. считывается строка
2. считываем подстроку по счетчику
3. проверяем является ли полностью цифровой
4. если да пишем в файл
5. переходим к пункту 2 если подстрока последняя переходим к пункту 1

8)


Время: 16:25