LINUX.ORG.RU

Строки в файле


0

0

Как программно (на си) узнать скок строк в файле? (чтоб потом циклом и fgets весь этот файл засунуть в gchar gc[])

anonymous

Никак!

while(fgets(...)!=NULL){gc[i++]=...}

Die-Hard ★★★★★
()

>while(fgets(...)!=NULL){gc[i++]=...} 1)Один из параметров fgets - это размер строки, а есть ли способ сделать его бусконечным, ведь, например, fscanf не нужен этот параметр (man fgets смотрел - там об этой трабле ни слова) 2)В переменной gchar gc[], gc[i] будет означать iтый символ, а не строку 3)Отсюда возникает следующая трабла: чтоб прокатил предложенный (см. выше) код, нужно знать колво символов в строке (чтоб установить верное значение переменной i (см. пункт 2)), но как это сделать? 4)Можно ли какнить реализовать следующий финт?: я предложенным выше кодом (без gc, просто i++) узнаю колво строк в файле (они будут записаны в i), а потом читаю какойнить функцией определенную строку. Только вот какой функцией?

anonymous
()

тупо mmap(..,..,PROT_READ,MAP_PRIVATE,....) +strchr()
не годится ?

sS ★★★★★
()

>while(fgets(...)!=NULL){gc[i++]=...} 5)Кстати, прога выдает Segmentation fault, и я тута подумал, почему? А, случаем, если юзать код указанный выше, то функция fgets(...), насколько я понял, будет читать все время одну и ту же строку (самую первую), и ето будет бесконечно ! Че делать?

ЗЫ у мя ща мало времени для сиденья в инете, поэтому я на всякий случай задаю этот вопрос и бегу скорей смареть, что за зверь ето: mmap(..,..,PROT_READ,MAP_PRIVATE,....) +strchr()

anonymous
()

>тупо mmap(..,..,PROT_READ,MAP_PRIVATE,....) +strchr() не годится ? Не mmap - не то. Кстати, еси юзать не fgets, а fgetc (с немного измененным алгоритмом), имхо получилось бы неплохо, токо вот ктонить знает каким символом обозначается в файле конец строки (/n - не прокатил)? Народ, неужто в си нету и хрен реализуешь фишку копирования всего текстового файла в переменную gchar(char)? Может ктонить знает еще ченить интересное касающееся сей траблы? Поделитесь плизз

anonymous
()

RE:

>токо вот ктонить знает каким символом обозначается в файле конец строки (/n - не прокатил)
EOF (#include <stdio.h>)

Murr ★★
()

RE:

вообще какая-то проблема на пустом месте...

#include <stdio.h>
main (int argc, char *argv[]) {
    FILE * f = fopen ("/tmp/mmap.c", "r");
    size_t s;
    char * area;

    fseek (f, 0, SEEK_END);
    s = ftell (f);
    printf ("%d\n", s);
    fseek (f, 0, SEEK_SET);
    area = (char *)malloc (s);
    fread (area, s, 1, f);
    fclose (f);
}

Murr ★★
()
Ответ на: RE: от Murr

2Murr
Как я понял из путанных объяснений - клиент хочет запихать файл в
char* a[]
так что пример немного не о том .....

sS ★★★★★
()

RE:

#include <stdio.h>
main (int argc, char *argv[]) {
    FILE * f = fopen ("/tmp/mmap.c", "r");
    size_t s;
    char * area;
    char ** areamap = malloc (sizeof (char *));
    int i, l = 1;

    fseek (f, 0, SEEK_END);
    s = ftell (f);
    printf ("%d\n", s);
    fseek (f, 0, SEEK_SET);
    area = (char *)malloc (s+1);
    fread (area, s, 1, f);
    area[s] = 0;

    areamap[0] = area;
    for (i=1; i<s; i++)
         if (area[i-1] == '\n') {
             areamap = realloc (areamap, (++l)*sizeof(char *));
             areamap[l-1] = area+i;
             area[i-1] = 0;
         }
    areamap = realloc (areamap, (++l)*sizeof(char *));
    areamap[l-1] = 0;

    while (*areamap) {
        printf ("%s\n", *(areamap++));
    }

    fclose (f);
}

Murr ★★
()

Народ, я тот чел, который открыл ету тему, вижу тут господин Мурр мне уже код написал, короче бегу пробовать код, а пока может кто посмотрит на код ниже, он работает, но почему-то при открытие файла из четырех и более строк (каждая символов по пять), он выдает мне Segmentation Fault, хотя при этом он пишет мне в консоль верное содержимое файла (точнее переменную с содержимым файла): gchar buffer[512]=""; gint gi,fd=open(file_name,O_RDONLY); while((gi=read(fd,buffer,sizeof(buffer)))>0) { strcat(gc,buffer); buffer[512]=""; } close(fd); g_print("%s",gc);

ЗЫ Отладчик (Анютовский) пробовал, ниче не нашел. Он исполняет функцию а потом говорит Segmentation Fault, т.е. после успешного выполнения всех строк кода.

anonymous
()

Опробовал Мурровский код - все путем, всем пасибо =)

anonymous
()
Ответ на: RE: от Murr

2Murr (*) (2003-09-05 21:40:59.159214):
А зачем лишний раз маппить файл? Можно же сразу:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DELTA_GS 512
#define MAX_STR_LEN 1024
#define FILE_NAME "/tmp/mmap.c"

char buf[MAX_STR_LEN];

int main(void)
{
 FILE * f = fopen (FILE_NAME, "r");
 char **gs=NULL;
 int n=0,TopN=0;
 int strTooLong=0;
   if(f==NULL)
      return 1;/*File not found*/
   while(fgets(buf,MAX_STR_LEN,f)!=NULL){
      int l=strlen(buf);

      if(strTooLong){
         fprintf(stderr,
           "Warning: String %d is too long, %d is not enough\n",
           n, MAX_STR_LEN);
         strTooLong=0;
      }
      if(buf[l-1]=='\n')/*Remove trailing EOL*/
         buf[l-1]='\0';
      else /*The string does not fit to the buffer?*/
         strTooLong=1;/*May be, just the last line in the file*/

      /*No error handling for possible memory exhausting:*/
      if(n>=TopN)
        gs=realloc(gs,(TopN+=DELTA_GS)*sizeof(char*));
      /*l=strlen(str)+1, 1 for trailing '\0':*/
      gs[n++]=strcpy((char*)calloc(l,1),buf);
   }/*while(fgets(buf,1024,f)!=NULL)*/
   fclose (f);

   /*Ok, now print it out - just for fun:*/
   printf("File %s is read: %d lines\n",FILE_NAME,n);
   for(strTooLong=0; strTooLong<n;strTooLong++)
     printf("%s\n",gs[strTooLong]);

   /*Free memory?*/
   return 0;
}

Die-Hard ★★★★★
()
Ответ на: комментарий от Murr

Murr (*) (2003-09-08 14:29:54.195263):

> Как раз для того, чтобы не было MAX_STR_LEN. ;)

Ок, вариант без MAX_STR_LEN:

fseek (f, 0, SEEK_END);
buff=malloc(ftell (f)+1);
fseek (f, 0, SEEK_SET);

:-)

Die-Hard ★★★★★
()
Ответ на: комментарий от Murr

Murr (*) (2003-09-08 15:26:04.065775):

> Задача то по-любому тривиальная ...

Согласен.

Просто мне вспомнилось, как в далеком 198... году я долго пытал народ, как текст (ДВУМЕРНУЮ структуру) можно записать на диск в последовательный файл (структуру по определению ОДНОМЕРНУЮ).

Самое удивительное, мой вопрос поставил в тупик нескольких тетушек - профи-программеров.

Сдается мне, что автор топика испытывает схожие проблемы:

> Как программно (на си) узнать скок строк в файле?

Очевидно, что кол-во строк в файле можно узнать ТОЛЬКО прочитав КАЖДЫЙ символ из файла.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.