>while(fgets(...)!=NULL){gc[i++]=...} 1)Один из параметров fgets - это размер строки, а есть ли способ сделать его бусконечным, ведь, например, fscanf не нужен этот параметр (man fgets смотрел - там об этой трабле ни слова) 2)В переменной gchar gc[], gc[i] будет означать iтый символ, а не строку 3)Отсюда возникает следующая трабла: чтоб прокатил предложенный (см. выше) код, нужно знать колво символов в строке (чтоб установить верное значение переменной i (см. пункт 2)), но как это сделать? 4)Можно ли какнить реализовать следующий финт?: я предложенным выше кодом (без gc, просто i++) узнаю колво строк в файле (они будут записаны в i), а потом читаю какойнить функцией определенную строку. Только вот какой функцией?
>while(fgets(...)!=NULL){gc[i++]=...} 5)Кстати, прога выдает Segmentation fault, и я тута подумал, почему? А, случаем, если юзать код указанный выше, то функция fgets(...), насколько я понял, будет читать все время одну и ту же строку (самую первую), и ето будет бесконечно ! Че делать?
ЗЫ у мя ща мало времени для сиденья в инете, поэтому я на всякий случай задаю этот вопрос и бегу скорей смареть, что за зверь ето: mmap(..,..,PROT_READ,MAP_PRIVATE,....) +strchr()
>тупо mmap(..,..,PROT_READ,MAP_PRIVATE,....) +strchr() не годится ? Не mmap - не то. Кстати, еси юзать не fgets, а fgetc (с немного измененным алгоритмом), имхо получилось бы неплохо, токо вот ктонить знает каким символом обозначается в файле конец строки (/n - не прокатил)? Народ, неужто в си нету и хрен реализуешь фишку копирования всего текстового файла в переменную gchar(char)? Может ктонить знает еще ченить интересное касающееся сей траблы? Поделитесь плизз
Народ, я тот чел, который открыл ету тему, вижу тут господин Мурр мне уже код написал, короче бегу пробовать код, а пока может кто посмотрит на код ниже, он работает, но почему-то при открытие файла из четырех и более строк (каждая символов по пять), он выдает мне 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, т.е. после успешного выполнения всех строк кода.
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;
}
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);
:-)
Просто мне вспомнилось, как в далеком 198... году я долго пытал народ, как текст (ДВУМЕРНУЮ структуру) можно записать на диск в последовательный файл (структуру по определению ОДНОМЕРНУЮ).
Самое удивительное, мой вопрос поставил в тупик нескольких тетушек - профи-программеров.
Сдается мне, что автор топика испытывает схожие проблемы:
> Как программно (на си) узнать скок строк в файле?
Очевидно, что кол-во строк в файле можно узнать ТОЛЬКО прочитав КАЖДЫЙ символ из файла.