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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считывание строк из файла на С 
V
    Опции темы
NetJunky
Дата 4.1.2010, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго времени суток.
Возможно тема и не очень разумна, но ничего не найдя по моему вопросу пришлось спрашивать тут.
Думаю сложного в этом ничего нету, но у меня немного проблемно.

Подскажите пожалуйста, как можно считать строку из файла, если я не знаю размера строки. Тоесть может быть, как мега большая, так и вообще пустая.

Заранее всем спасибо.


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
bourne
Дата 4.1.2010, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



fgetc() должна помочь
PM MAIL   Вверх
NetJunky
Дата 4.1.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тоесть варианта, как разом считывать строку нету? Только по символьно?


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
zim22
Дата 4.1.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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





--------------------
PM MAIL   Вверх
zloyshprot
Дата 4.1.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я позволю себе влезть в данную тему, потому как вопрос мой связан с ней =)
Есть код, по вытаскиванию строчек из файла: 

Код

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

using namespace std;

int main(void)
{
    FILE *file;
    errno_t error;
    char line[128];

    int num = 0;

    if( ( error = fopen_s( &file, "whitelist.txt", "r" ) ) != 0 )
        printf("Unable to open file");
    else
    {
        printf("File opened\n");
        while( fgets( line, sizeof( line ), file ) != NULL )
        {
            printf( line );
//            remove( line );
        }
    }
    if( file )
        fclose( file );
    printf("\nPress any key... ");
    getchar();
    return 0;
}


Собственно вопрос в том, что каждая строка считывается с переносом на следующую строку. 
т.е. вывод: 
File opened
1bla.txt
2bla.txt
3bla.txt
4bla.txt
Press any key...

Есть варианты, чтобы не было переносов на новую строку? А то мне надо дальше удалять файлы из списка, а я получаю Invalid argument и удаляется только самый последний файл из списка. 
PM MAIL   Вверх
bourne
Дата 4.1.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(zim22 @  4.1.2010,  12:55 Найти цитируемый пост)
fgets 

Она ж принимает в качестве аргумента количество символов...
Цитата(NetJunky @  4.1.2010,  05:53 Найти цитируемый пост)
может быть, как мега большая, так и вообще пустая.

Можно конечно указать 1000000 smile

Цитата(NetJunky @  4.1.2010,  12:05 Найти цитируемый пост)
Тоесть варианта, как разом считывать строку нету? Только по символьно? 

Ну если ты не знаешь  какая длина у строки, то имхо только посимвольно, т.к. надо "поймать" конец строки...

Добавлено через 3 минуты и 9 секунд
Цитата(zloyshprot @  4.1.2010,  13:27 Найти цитируемый пост)
Собственно вопрос в том, что каждая строка считывается с переносом на следующую строку. 

С каким переносом?
PM MAIL   Вверх
zim22
Дата 4.1.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(bourne @  4.1.2010,  14:16 Найти цитируемый пост)
может быть, как мега большая, так и вообще пустая.

не обратил на это внимание. тогда fgetc  smile 


--------------------
PM MAIL   Вверх
NetJunky
Дата 4.1.2010, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zloyshprot, тебе надо fgetc. Так как тогда ты можешь каждый считываемый символ проверять на \n и если так, то делать запись за место \n на \0 и переходить на следующую строку.

Вопрос такой. Если у меня массив вышел, который из трёх ячеек [1][3][\0]. Можно ли как-то верно перевести его в int или может есть какой-то алгоритм, как можно считать в int так чтобы получилось такое число?

П.С. 13 привёл, как пример, может быть и любое другое.


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
ller
Дата 4.1.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(NetJunky @  4.1.2010,  17:08 Найти цитируемый пост)
Вопрос такой. Если у меня массив вышел, который из трёх ячеек [1][3][\0]. Можно ли как-то верно перевести его в int или может есть какой-то алгоритм, как можно считать в int так чтобы получилось такое число?


atoi() ?
PM MAIL   Вверх
djamshud
Дата 4.1.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



Не сходите с ума, к черту посимвольное чтение. Читайте буферами и ищите в нем перенос строки.

Также в GNU еще есть специальное расширение: man getline.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
xvr
Дата 5.1.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Надо замэпить файл в память и искать строки в ней (с помощью memcmp например)

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


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



xvr предложил наилучший способ. Вечно я про него забываю.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
NetJunky
Дата 6.1.2010, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



xvrdjamshud, я так понимаю, что Ваши советы были уже не на млй вопрос)


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
djamshud
Дата 6.1.2010, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



NetJunky, нет, на ваш:). Только это советы не в духе "вызвать такую-то функцию", а впринципе, как делать. Код получится более громоздким, но куда более эффективным.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
NetJunky
Дата 6.1.2010, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



djamshud, просто memcmp ещё я могу понять, а вот getline() если я не ошибаюсь используется только начиная с С++, а значит уже изначально не подходила. Так как спрашивал именно про Си, но всёравно спасибо.
Просто далее был вопрос от человека у котого пример на С++, вот и решил, что ответ уже ему адресуются.


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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