Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно использовать fgets? 
V
    Опции темы
AxNe0
Дата 11.5.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 24.4.2006
Где: St. Petersburg

Репутация: нет
Всего: 5



Как можно прочесть первую строку открытого с помощью fopen файла?
 smile  
 

Это сообщение отредактировал(а) AxNe0 - 11.5.2006, 13:27


--------------------
SCJP 6, SCBCD 5, OCEWSD 6
blog
PM ICQ Skype   Вверх
Romikgy
Дата 11.5.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Код

/* fgets example */ 

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

int main(void)
{
   FILE *stream;
   char string[] = "This is a test";
   char msg[20];
   /* open a file for update */
   stream = fopen("DUMMY.FIL", "w+");
   /* write a string into the file */
   fwrite(string, strlen(string), 1, stream);
   /* seek to the start of the file */
   fseek(stream, 0, SEEK_SET);
   /* read a string from the file */
   fgets(msg, strlen(string)+1, stream);
   /* display the string */
   printf("%s", msg);
   fclose(stream);
   return 0;
}
 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
AxNe0
Дата 11.5.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 24.4.2006
Где: St. Petersburg

Репутация: нет
Всего: 5



Romikgy, а если заранее длина строки неизвестна? 


--------------------
SCJP 6, SCBCD 5, OCEWSD 6
blog
PM ICQ Skype   Вверх
likehood
Дата 11.5.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Вторым параметром fgets задается максимальный размер строки, т.е. длина массива string. Эта длина должна быть заведомо больше самой длинной строки в файле. 
PM MAIL   Вверх
gepard
Дата 11.5.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Значит её сначала надо посчитать smile
Считываешь по байтам, когда встречаешь конец строки - обрываешь увелечение счётчика и получаешь длинну. 


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
bsa
Дата 11.5.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код

char *fgets(char *s, int size, FILE *stream);

fgets() reads in at most one less than size characters from stream  and
       stores  them  into  the buffer pointed to by s.  Reading stops after an
       EOF or a newline.  If a newline is read, it is stored into the  buffer.
       A '\0' is stored after the last character in the buffer.

Таким образом, если в конце прочитанной строки отсутствует символ конца строки ('\n'), то это говорит:
  а) строка в файле длиннее, чем выделенный под нее буфер
  б) достигнут конец файла (это условие можно проверить с помощью feof(stream) )
Поэтому, чтобы прочитать строку любой длины из файла, надо:

1. выделить буфер s размером n=N знаков: s = (char*)malloc( n );
2. объявить переменную переменной int d = 0;
3. прочитать в s + d не более (n-d) символов
4. d += strlen(s);
5. ecли feof(fd) != 0, то переход на п. 7
6. если s[ d - 1] != '\n'
6.1. n += N;
6.2. увеличить объем буфера: s = (char*)realloc( s, n )
6.3. перейти на п. 3
7. если feof(fd) != 0, то d = 0
8. переход на п. 3
9. конец.

В пункте 7 имеем полностью прочитанную строку. Все, кроме последней быть может, будут заканчиваться на символ конца строки '\n'. 
PM   Вверх
nworm
Дата 11.5.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 1
Всего: 8



Если пошли такие проблемы, то можно просто писать свою функцию (чтобы от длины строки не зависела). А за основу взять код функции fgets из стандартной библиотеки.  

Это сообщение отредактировал(а) nworm - 11.5.2006, 17:43
PM MAIL WWW   Вверх
AxNe0
Дата 11.5.2006, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 24.4.2006
Где: St. Petersburg

Репутация: нет
Всего: 5



Написал:
Код

    FILE *file;
         char *loadstring=new char[100];
    char *msg;    
         file = fopen(filename, "r");
    if (file!= 0 )
    {
        int LineLength=0;
        fseek(file, 0, SEEK_SET);
        while (1)
        {
            char ch = fgetc(file);
            if ( ch == '\n' ||  ch == '\r' ) break;
            LineLength++;
        };
    
        if (LineLength!=0)
        {
            fseek(file, 0, SEEK_SET);
            char *m = new CHAR[LineLength];
            fgets(m, LineLength, file);
            strcpy(msg,m);
        };
    };
    fclose(file);

Не работает. Почему?  smile  


--------------------
SCJP 6, SCBCD 5, OCEWSD 6
blog
PM ICQ Skype   Вверх
Dithur
Дата 11.5.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



Функция подсчёта длины списка, думаю можно идею использовать для подсчёта длины первой строки файла, если чуть-чуть подправить: 

Код

int lstlen(CHR_LST *left, CHR_LST *right)
{
    int len=0;
    CHR_LST *tmp=left; 
    while(tmp!=NULL&&tmp!=right->next)
    {
    len++;
    tmp=tmp->next;
    }
    return len;
}



Честно признаюсь код сдул месяц назад с кого-то задачника, по-моему с Тарасова, может пригодится smile 
PM MAIL   Вверх
Romikgy
Дата 12.5.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



AxNe0, если неизвестно , тогда счтитывай по символьно , до перевода строки 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
AxNe0
Дата 12.5.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 24.4.2006
Где: St. Petersburg

Репутация: нет
Всего: 5



Кто-нибудь знает, где можно найти более-менее понятное описание функций из <string.h>? До использовал ObjectPascal, а тут функции немного по-другому называются...  smile  


--------------------
SCJP 6, SCBCD 5, OCEWSD 6
blog
PM ICQ Skype   Вверх
bsa
Дата 12.5.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
char * readline(FILE * f) {
     int d = 0;
     char * s = NULL;
     char * r;
     while( !feof(f) ) {
          s = realloc( s, d + 128);
          r = fgets(s + d, 128, f);
          if ( r == s ) {
                d = strlen(s);
                if ( ( d == 0 ) || ( s[d-1] == '\n' ) ) { //сомнительная строка. корректность выполнения зависит от конкретного компилятора и оптимизации
                      s = (char*)realloc(s, d + 1 );
                      break;
                }
          }
     }
     return s;
}


Добавлено @ 11:25 
Цитата(AxNe0 @ 12.5.2006,  11:08)
Кто-нибудь знает, где можно найти более-менее понятное описание функций из <string.h>? До использовал ObjectPascal, а тут функции немного по-другому называются...  smile

http://www.google.com/search?hs=en7&hl...1%D0%BA&lr= 
PM   Вверх
AxNe0
Дата 12.5.2006, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 24.4.2006
Где: St. Petersburg

Репутация: нет
Всего: 5



Всем спасибо! Учел.
Код

char * o_file(char *filename)
{
        char *result="";
        FILE *f;
        f = fopen(filename, "r");
        if (f!= 0 )
            {
            //int LineLength=0;
            char ch;
            fseek(f, 0, SEEK_SET);
            while (!feof(f) && ch != '\n' &&  ch != '\r')
                {
                ch = fgetc(f);
                if ( ch != '\n' &&  ch != '\r' && !feof(f)) result+=ch;
                };
            return(result);
            }
        else 
        {
            AfxMessageBox("Файл не найден",MB_OK | MB_ICONSTOP,0);
            return("Файл не найден");
        };
        fclose(f);
};

Результат функции должен отображаться на CStatic, но отображается вместо латинских букв такая штука: user posted image
Как можно поправить ситуацию?  smile  


--------------------
SCJP 6, SCBCD 5, OCEWSD 6
blog
PM ICQ Skype   Вверх
Romikgy
Дата 13.5.2006, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(AxNe0 @  12.5.2006,  22:39 Найти цитируемый пост)
 отображаться на CStatic

покажи код вывода в цстатик? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
AxNe0
Дата 13.5.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 24.4.2006
Где: St. Petersburg

Репутация: нет
Всего: 5



Вот весь код, относящийся к CStatic
Код

         MyStatic = new CStatic();
    if (MyStatic!=NULL) MyStatic->Create(o_file(filename),WS_CHILD|WS_VISIBLE|SS_CENTER,    rcstat,this);
    MyStatic->CenterWindow(this);
 


--------------------
SCJP 6, SCBCD 5, OCEWSD 6
blog
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0895 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.