ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Нужно убрать текстовую часть из файла
  #1  
Старый 17.07.2008, 20:50
Аватар для .Sylar
.Sylar
Познающий
Регистрация: 15.07.2008
Сообщений: 37
Провел на форуме:
310754

Репутация: 37
Отправить сообщение для .Sylar с помощью ICQ
Talking Нужно убрать текстовую часть из файла

Есть файл, в котором хранятся записи вида 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
Спасибо за помощь,
ЗЫ. название темы получше придумать не смог :/
 
Ответить с цитированием

  #2  
Старый 17.07.2008, 21:07
Аватар для _antony
_antony
Познающий
Регистрация: 16.07.2008
Сообщений: 82
Провел на форуме:
424387

Репутация: 142
По умолчанию

Цитата:
Объясняю как это нужно делать. Пройтись от числа 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);

Последний раз редактировалось _antony; 17.07.2008 в 22:21..
 
Ответить с цитированием

  #3  
Старый 17.07.2008, 22:33
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

дафайте и я набросаю 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;
}

Последний раз редактировалось Delimiter; 18.07.2008 в 00:53..
 
Ответить с цитированием

  #4  
Старый 17.07.2008, 23:41
Аватар для .Sylar
.Sylar
Познающий
Регистрация: 15.07.2008
Сообщений: 37
Провел на форуме:
310754

Репутация: 37
Отправить сообщение для .Sylar с помощью ICQ
По умолчанию

Ни то, ни другое не работает Скачал я с торента 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'
 
Ответить с цитированием

  #5  
Старый 18.07.2008, 00:01
Аватар для _antony
_antony
Познающий
Регистрация: 16.07.2008
Сообщений: 82
Провел на форуме:
424387

Репутация: 142
По умолчанию

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

  #6  
Старый 18.07.2008, 00:07
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

изменил на feof
 
Ответить с цитированием

  #7  
Старый 18.07.2008, 00:27
Аватар для .Sylar
.Sylar
Познающий
Регистрация: 15.07.2008
Сообщений: 37
Провел на форуме:
310754

Репутация: 37
Отправить сообщение для .Sylar с помощью ICQ
По умолчанию

Delimiter,

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

  #8  
Старый 18.07.2008, 00:42
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

проверил все работает
(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

Последний раз редактировалось Delimiter; 18.07.2008 в 00:53..
 
Ответить с цитированием

  #9  
Старый 18.07.2008, 18:25
Аватар для Irdis
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

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

  #10  
Старый 19.07.2008, 00:35
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

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

8)

Последний раз редактировалось Delimiter; 19.07.2008 в 16:38..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать определенную часть файла. LynXzp Soft - Windows 1 01.03.2008 05:26
Кто силен в bash? помогите плз решить задачки... Dj Skeleton™ *nix 28 19.12.2007 13:03
Права доступа в *nix системах Scipio Авторские статьи 21 16.12.2007 06:10



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ