Как в с++ считать строчку целиком из файла?
От: kirina  
Дата: 02.06.02 13:47
Оценка:
Как в с++ считать строчку целиком из файла?
kirina
Re: Как в с++ считать строчку целиком из файла?
От: SergH Россия  
Дата: 02.06.02 14:06
Оценка:
Здравствуйте kirina, Вы писали:

K>Как в с++ считать строчку целиком из файла?


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

     char ch;
     DWORD readen;
     smart_string str; // какой-нибудь класс, инкапсулирующий строку с изменяющимся размером

     for (;;)
     {
         if (!ReadFile(hFile, &ch, sizeof(ch), &readen, NULL)) break;
         if (0 == readen) break;

         if ('\r' == ch) 
         {
             // считать '\n'
             ReadFile(hFile, &ch, sizeof(ch), &readen, NULL);
             break;
         }
         
         str.AddChar(ch);
     }
Делай что должно, и будь что будет
Re[2]: Как в с++ считать строчку целиком из файла?
От: SergH Россия  
Дата: 02.06.02 14:07
Оценка:
Здравствуйте SergH, Вы писали:

Это самый простой вариант. Если не лень, можно добавить буферизацию.
Делай что должно, и будь что будет
Re: Как в с++ считать строчку целиком из файла?
От: Sasparella США  
Дата: 02.06.02 14:32
Оценка:
Здравствуйте kirina, Вы писали:

K>Как в с++ считать строчку целиком из файла?

K>kirina


char buffer[MAX_EXPECTED_STRING_LENGTH];
fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), pFile);


Саша.
Re: Как в с++ считать строчку целиком из файла?
От: Хитрик Денис Россия RSDN
Дата: 02.06.02 16:17
Оценка:
Перенесено в С++ из WinAPI.
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re: Как в с++ считать строчку целиком из файла?
От: slonnik  
Дата: 03.06.02 06:10
Оценка:
Здравствуйте kirina, Вы писали:

K>Как в с++ считать строчку целиком из файла?

K>kirina

ну если у тебя идет не только чтение а сериализация (чтение/ запись) то переде записью строки сохрани сначал в файле ее размер (количество символов) и при чтение будет просто считать строку целиком
Re: Как в с++ считать строчку целиком из файла?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.06.02 11:35
Оценка:
Здравствуйте kirina, Вы писали:

K>Как в с++ считать строчку целиком из файла?

K>kirina

getline для std::string из STL?

string    str;
ifstream  file("text.txt");

while(!str.eof())
 getline(file,str);
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Чего это стоит? :)
От: Константин Быченков  
Дата: 04.06.02 06:50
Оценка:
Здравствуйте Коваленко Дмитрий, Вы писали:

КД>Здравствуйте kirina, Вы писали:


K>>Как в с++ считать строчку целиком из файла?

K>>kirina

КД>getline для std::string из STL?


КД>
КД>string    str;
КД>ifstream  file("text.txt");

КД>while(!str.eof())
КД> getline(file,str);
КД>




А насколько это эффективно по сравнению с
//------------------------------------------------------------
char ch;
DWORD readen;
smart_string str; // какой-нибудь класс, инкапсулирующий строку с изменяющимся размером
for (;)
{
if (!ReadFile(hFile, &ch, sizeof(ch), &readen, NULL)) break;
if (0 == readen) break;
if ('\r' == ch)
{
// считать '\n'
ReadFile(hFile, &ch, sizeof(ch), &readen, NULL);
break;
}
str.AddChar(ch);
}
//------------------------------------------------------------
или с
//------------------------------------------------------------
char buffer[MAX_EXPECTED_STRING_LENGTH];
fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), pFile);
//------------------------------------------------------------

??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности?
А то, хочется перейти на "прогрессивный" STL, но что то боязно. Можно просто ответить ссылкой, я разберусь.
Re[3]: Чего это стоит? :)
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 04.06.02 07:04
Оценка:
Здравствуйте Константин Быченков, Вы писали:

КБ>Здравствуйте Коваленко Дмитрий, Вы писали:


КД>>Здравствуйте kirina, Вы писали:


K>>>Как в с++ считать строчку целиком из файла?

K>>>kirina

КД>>getline для std::string из STL?


КД>>
КД>>string    str;
КД>>ifstream  file("text.txt");

КД>>while(!str.eof())
КД>> getline(file,str);
КД>>


КБ>А насколько это эффективно по сравнению с

Честно сказать? — не знаю.
Если очень интересно "что там и как делается", то смотри исходные тексты шаблона getline. В BCB3/5 они находятся в <istream.cc>

А вот насчет — насколько это гибче? Попаришься с реализацией поддержки однобайтных и двухбайтных символов — сам поймешь.

К тому же, на С++ пишут не только под Win32
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Чего это стоит? :)
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 04.06.02 07:33
Оценка:
Здравствуйте Константин Быченков, Вы писали:

КБ>А насколько это эффективно по сравнению с ...


КБ>??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности?

Сопровождаются <b>колоссальными</b>
Автор: Kaa
Дата: 29.05.02
издержками (тестровано на одном компиляторе, на одном STL)

КБ>А то, хочется перейти на "прогрессивный" STL, но что то боязно. Можно просто ответить ссылкой, я разберусь.


Гут. Не везде "прогрессивность" — хорошо. Надо иметь смелость иногда пользоваться тем хорошим, что есть в отживших/устаревших технологиях.
Алексей Кирдин
Re[4]: Чего это стоит? :)
От: Alik Украина  
Дата: 04.06.02 13:15
Оценка:
Здравствуйте Kaa, Вы писали:

Kaa>Здравствуйте Константин Быченков, Вы писали:


КБ>>А насколько это эффективно по сравнению с ...


КБ>>??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности?

Kaa>Сопровождаются <b>колоссальными</b>
Автор: Kaa
Дата: 29.05.02
издержками (тестровано на одном компиляторе, на одном STL)


КБ>>А то, хочется перейти на "прогрессивный" STL, но что то боязно. Можно просто ответить ссылкой, я разберусь.


Kaa>Гут. Не везде "прогрессивность" — хорошо. Надо иметь смелость иногда пользоваться тем хорошим, что есть в отживших/устаревших технологиях.


И, тем не менее, иногда использование STL оказывается дешевле и (не побоюсь этого слова) эффективнее.
К примеру, в данном случае, я думаю, оно вполне оправдано (если, разумеется, не запрещено требованиями проекта). Дисковые операции и так достаточно медленные и, как правило, являются разовыми.

Но, разумеется, в каждом конкретном случае надо отдельно принимать решение, использовать ли STL.
С уважением. Алик.
Re[4]: Чего это стоит? :)
От: Аноним  
Дата: 04.06.02 13:22
Оценка:
Здравствуйте Kaa, Вы писали:

Kaa>Здравствуйте Константин Быченков, Вы писали:


КБ>>А насколько это эффективно по сравнению с ...


КБ>>??? Тоесть не сопровождаются ли обращения к потокам большим количеством проверок, форматирования или еще чего то? Насколько велики издержки при получении удобств потоков вообще и файловых потоков в частности?

Kaa>Сопровождаются <b>колоссальными</b>
Автор: Kaa
Дата: 29.05.02
издержками (тестровано на одном компиляторе, на одном STL)


А STL патченый? У dinkumware ошибка была, сильно снижавшая производительность работы со стримами — не в ней дело?
Re[4]: Чего это стоит? :)
От: Константин Быченков  
Дата: 05.06.02 05:54
Оценка:
Здравствуйте Kaa,
Kaa>Гут. Не везде "прогрессивность" — хорошо. Надо иметь смелость иногда пользоваться тем хорошим, что есть в отживших/устаревших технологиях.

Сделал тест на BCB5. Возможно, не вполне корректный. Нехочу ничего хвалить или ругать, просто предлагаю к сведению.

Вот это работает 41 секунду
     long ltmp;
     ofs.open("stream.txt", std::ios_base::app);
     if (!ofs)
     {  MessageBox(NULL, "Не открывается выходной файл потока!!!", "Потоки и файлы", MB_OK);
        return;
     }
     str = "===Это тест потока Строка 32 байт";
     secstream = time(&secstream);    //time
     for (int i = 0; i < 32768*20; i++)
         ofs << str << '\n';
     ltmp = time(&ltmp);
     secstream = ltmp - secstream;
     ofs << secstream;
     ofs.close();
     ofs.clear();


А это 6 секунд. TMsgFile — мой класс, работающий через ReadFile/WriteFile

    char buf0[20];
     long ltmp;
     MyFile = new TMsgFile("file.txt");
     secfile = time(&secstream);    //time
     for (int i = 0; i < 32768*20; i++)
         MyFile->WriteStrToFile("===Это тест файла Строка 32 байт\n");
     ltmp    = time(&ltmp); //itoa
     secfile = ltmp - secfile;
     itoa(secfile, buf0, 10);
     MyFile->WriteStrToFile(buf0);
     delete MyFile;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.