Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Нужно убрать текстовую часть из файла |

17.07.2008, 20:50
|
|
Познающий
Регистрация: 15.07.2008
Сообщений: 37
Провел на форуме: 310754
Репутация:
37
|
|
Нужно убрать текстовую часть из файла
Есть файл, в котором хранятся записи вида 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
Спасибо за помощь,
ЗЫ. название темы получше придумать не смог :/
|
|
|

17.07.2008, 21:07
|
|
Познающий
Регистрация: 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..
|
|
|

17.07.2008, 22:33
|
|
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..
|
|
|

17.07.2008, 23:41
|
|
Познающий
Регистрация: 15.07.2008
Сообщений: 37
Провел на форуме: 310754
Репутация:
37
|
|
Ни то, ни другое не работает  Скачал я с торента 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'
|
|
|

18.07.2008, 00:01
|
|
Познающий
Регистрация: 16.07.2008
Сообщений: 82
Провел на форуме: 424387
Репутация:
142
|
|
вместо true можно единицу поставить)
|
|
|

18.07.2008, 00:07
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
изменил на feof 
|
|
|

18.07.2008, 00:27
|
|
Познающий
Регистрация: 15.07.2008
Сообщений: 37
Провел на форуме: 310754
Репутация:
37
|
|
Delimiter,
эээ чё-бы там исправить, чтобы работало для A:1:2:3:4.44:5:6 ? 
|
|
|

18.07.2008, 00:42
|
|
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
Output.txt
Последний раз редактировалось Delimiter; 18.07.2008 в 00:53..
|
|
|

18.07.2008, 18:25
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
ууу... жесть какая...
а не проще было бы считать фаил посимвольно в массив
и сравнить по кодам отдельно взятых символов
|
|
|

19.07.2008, 00:35
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
а в чем упрощение
Алгоритм
1. считывается строка
2. считываем подстроку по счетчику
3. проверяем является ли полностью цифровой
4. если да пишем в файл
5. переходим к пункту 2 если подстрока последняя переходим к пункту 1
8)
Последний раз редактировалось Delimiter; 19.07.2008 в 16:38..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|