Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

File parsing

16K
14 июня 2007 года
4nob1oz
34 / / 14.06.2007
Вот никак не могу разобраться. Есть у меня файл. В нём например записано
 
Код:
ftp://123456:654321@192.168.1.1


Вот исходник:
Код:
#include <stdio.h>
#include <string.h>

int main( int argc, char **argv )
{
FILE *f1,*f2;
errno_t errno;
char list[31];


if (argc < 3)
{
printf("\n  ---------------------------------------\n");
printf("  Usage: pars.exe <existing file> <output file>\n");
printf("  ---------------------------------------\n");
return 0;
}

errno = fopen_s(&f1,argv[1],"r+");
errno = fopen_s(&f2,argv[2],"w+");

if ( f1 == NULL )
{
printf("[-] Cannot open file\n");
return 0;
}

fread(&list,sizeof(list),(int)strlen(list),f1);
fclose(f1);
printf("\nString: %s\n",list);
fwrite(list,sizeof(str),(int)strlen(str),f2);
fclose(f2);

return 0;
}


Когда я записываю в файл то у меня после ftp://123456:654321@192.168.1.1 ещё много всяких символов и не знаю как с этим бороться. Сначала с помощью printf тоже выводилось много мусора мосле текста а сеёчас вроде нет хотя это не из-зи list[31] хоть list[256] поставить всё равно через printf всё будут выведено нормально.
Подскажите как мне записать в файл нормально, а то я уже и не знаю как это сделать.
10K
14 июня 2007 года
nuhop
50 / / 24.03.2007
Попробуй так:

 
Код:
fread(list, sizeof(list), 1, f1);
list[strlen(list)] = 0;
255
14 июня 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: 4nob1oz
Вот никак не могу разобраться. Есть у меня файл. В нём например записано
 
Код:
ftp://123456:654321@192.168.1.1


Вот исходник:
Код:
#include <stdio.h>
#include <string.h>

int main( int argc, char **argv )
{
FILE *f1,*f2;
errno_t errno;
char list[31];


if (argc < 3)
{
printf("\n  ---------------------------------------\n");
printf("  Usage: pars.exe <existing file> <output file>\n");
printf("  ---------------------------------------\n");
return 0;
}

errno = fopen_s(&f1,argv[1],"r+");
errno = fopen_s(&f2,argv[2],"w+");

if ( f1 == NULL )
{
printf("[-] Cannot open file\n");
return 0;
}

fread(&list,sizeof(list),(int)strlen(list),f1);
fclose(f1);
printf("\nString: %s\n",list);
fwrite(list,sizeof(str),(int)strlen(str),f2);
fclose(f2);

return 0;
}


Когда я записываю в файл то у меня после ftp://123456:654321@192.168.1.1 ещё много всяких символов и не знаю как с этим бороться. Сначала с помощью printf тоже выводилось много мусора мосле текста а сеёчас вроде нет хотя это не из-зи list[31] хоть list[256] поставить всё равно через printf всё будут выведено нормально.
Подскажите как мне записать в файл нормально, а то я уже и не знаю как это сделать.


Это элементарно, Ватсон! У вас строка не закачивается терминальным нклем. Ее либо нужно записать в первоначальный файл, либо сообщить програмке размер строки, либо вставлять его при нрекоторых условиях. например, заменять пробел символом 0х00.

16K
14 июня 2007 года
4nob1oz
34 / / 14.06.2007
Ну чудеса ;-) Да первый раз я код немного неправильный кинул, вот подправил всё
Код:
#include <stdio.h>
#include <string.h>

int main( int argc, char **argv )
{
FILE *f1,*f2;
errno_t errno;
char list[31];


if (argc < 3)
{
printf("\n  ---------------------------------------\n");
printf("  Usage: pars.exe <existing file> <output file>\n");
printf("  ---------------------------------------\n");
return 0;
}

errno = fopen_s(&f1,argv[1],"r+");
errno = fopen_s(&f2,argv[2],"w+");

if ( f1 == NULL )
{
printf("[-] Cannot open file\n");
return 0;
}

fread(list, sizeof(list), 1, f1);
list[strlen(list)] = 0;
printf("\nString: %s\n",list);
fwrite(list,sizeof(list),1,f2);
fclose(f2);
fclose(f1);

return 0;
}


Только вот не пойму никак почему именно в
fread(list, sizeof(list), 1, f1); и fwrite(list,sizeof(list),1,f2); в третьем параметре нужно было писать 1. В документации написано что это "Maximum number of items to be read" это чтоже получается мне надо все пункты посчитать а потом парсить чтоли :confused: Вот этот момент обьясните тогда. А так спасибо за советы.
398
14 июня 2007 года
Alexandoros
630 / / 21.10.2005
Цитата: nuhop
Попробуй так:
 
Код:
list[strlen(list)] = 0;



Это 5. В меморайз. :D:D:D:D

10K
14 июня 2007 года
nuhop
50 / / 24.03.2007
Все просто, если вчитаться:
 
Код:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

fread reads n items of data each of length size bytes from the given input stream into a block pointed to by ptr.
398
14 июня 2007 года
Alexandoros
630 / / 21.10.2005
Начнем с того что ты не понимаеш сколько символов ты должен прочитать для составления строки. Определись сначало с разделителями.

И вообще советую почитать, что такое строки, файлы, и с чем их едят. Ибо знания твои минимальны.
Цитата: 4nob1oz


Код:
#include <stdio.h>
#include <string.h>

int main( int argc, char **argv )
{
FILE *f1,*f2;
errno_t errno;
char list[31];


if (argc < 3)
{
printf("\n  ---------------------------------------\n");
printf("  Usage: pars.exe <existing file> <output file>\n");
printf("  ---------------------------------------\n");
return 0;
}

errno = fopen_s(&f1,argv[1],"r+");
errno = fopen_s(&f2,argv[2],"w+");

if ( f1 == NULL )
{
printf("[-] Cannot open file\n");
return 0;
}

memset(list, 0, sizeof(list));
fread(list, sizeof(list), 1, f1);
printf("\nString: %s\n",list);
fwrite(list,sizeof(list),1,f2);
fclose(f2);
fclose(f1);

return 0;
}

16K
15 июня 2007 года
4nob1oz
34 / / 14.06.2007
Да знаю что знания минимальны. Почитать то почитал и все функции пересмотрел. Я просто пример привёл. Мне же не одну строку надо прочитать а файл со списком строк. Я никак не могу разобраться. Все же строки не будут одного размера верно? Вот то что у меня получилось после тога как мне тут насоветовали.
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>

int main( int argc, char **argv )
{
FILE *f1,*f2;                                
errno_t errno;                              
char list[256],list2[256];                
char delim[] = ":@";                      
char *token;                              
int offset=6;                              


if (argc < 3)
{
printf("\n  ---------------------------------------------\n");
printf("  Usage: pars.exe <existing file> <output file>\n");
printf("  ---------------------------------------------\n");
return 0;
}

errno = fopen_s(&f1,argv[1],"r+");  
errno = fopen_s(&f2,argv[2],"w+");

if ( f1 == NULL )
{
printf("[-] Cannot open file\n");
return 0;
}

fseek(f1,0L,SEEK_SET);                

while(!feof(f1))                          
{
fseek(f1,offset,SEEK_CUR);          
fgets(list,100,f1);                        
printf("%s",list);                          
sscanf_s("%s",list);                    
fprintf(f2,"%s",list);                    
}

fseek(f2,0L,SEEK_SET);              

while(!feof(f2))                          
{
    fgets(list2,80,f2);              
    token=strtok(list2,delim);    
    while(token!=NULL)            
    {
        printf("%s\0",token);  
        token=strtok(NULL,delim);
    }
}

fclose(f1);                                    
fclose(f2);

return 0;
}


Хотел сделать чтобы файл если открыть там был список фтп. Все их пропарсит и отбросит ftp:// потом логины записать в один файл пароли в другой а хосты в третий. Вот и разбираюсь. Вроде разделяю через strtok а как записать в отдельные файлы не разберусь. Помогите ;-) Я думаю для знатоков не будет это сложно.
398
19 июня 2007 года
Alexandoros
630 / / 21.10.2005
Чтоб все прошло легко - читай посимвольно входной файл и заполняй строку. Когда встречаются символы '\r' или '\n' - заканчиваеш формировать текущую строку (дописываеш 0 в конец), копируеш её куда надо, и начинаеш читать в новую строку(пропустивши '\r' и '\n').
16K
20 июня 2007 года
4nob1oz
34 / / 14.06.2007
Всё я разобрался ;-) Тему я думаю можно закрывать. Вот код
Код:
#include <stdio.h>
#include <string.h>

#define MAX_LINE_TO_READ 1024

int main(int argc, char **argv) {
  FILE *inf, *outf;
  char *user, *passwd, *host, *someptr, buffer[MAX_LINE_TO_READ + 1] = {0};

  if (argc != 3 ) {
     printf("\n---------------------------------------------\n");
     printf(" Usage: parse.exe <input file> <output file>\n");
     printf("---------------------------------------------\n");

     return -1;
  }

  if ((inf = fopen(argv[1], "r")) == NULL) {
     printf("[-] Could not open input file\n");

     return -1;
  }

  printf("[+] Input file opened...\n");

  if ((outf = fopen(argv[2], "w+")) == NULL) {
     printf("[-] Could not open output file\n");

     return -1;
  }

  printf("[+] Output file opened...\n");
  printf("[+] Reading data...\n");

  while(!feof(inf))
  {
     fgets(&buffer[0], MAX_LINE_TO_READ, inf);

     if (someptr = strstr(&buffer[0], "//"))
        user = strtok(&someptr[2], ":");
     else
        user = strtok(&buffer[0], ":");

     passwd = strtok(NULL, "@");
     host = strtok(NULL, "");

     fprintf(outf, "%s\n%s\n%s", user, passwd, host);
     printf("[+] Writing portion of data...\n");

     memset(buffer, MAX_LINE_TO_READ + 1, 0);
  }

  fclose(outf);
  fclose(inf);

  printf("[+] Exiting...\n");

  return 0;
}


Спасибо всем кто помогал.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог