Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Считывание файла  (Прочитано 39775 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Пенсионер
Гость
« : 22-10-2003 16:27 » 

Подскажите как считать по байтово(чтоб со всеми символами перехода строки и другой спей символикой) текстовый файл и загнать его в массив.

Спасибо...
Записан
Serega
Гость
« Ответ #1 : 22-10-2003 17:36 » 

Самое простое это копировать побайтно
Код:
vector<char> buffer;
ifstream fin("filename");
char ch;
while(fin.get(ch)) buffer.push_back(ch);
« Последнее редактирование: 20-11-2007 18:06 от Алексей1153++ » Записан
Serega
Гость
« Ответ #2 : 22-10-2003 18:02 » 

Можно читать сразу блоками
Код:
char buffer[100];
fin.read(buffer,100);
« Последнее редактирование: 20-11-2007 18:07 от Алексей1153++ » Записан
grozny
Гость
« Ответ #3 : 22-10-2003 21:53 » 

Альтернатива - старый добрый stdio

const bufsz=1024;
char buf[bufsz];
int size;

FILE* fp=fopen("filename", rb);
if(fp)
{
    size=fread(buf,bufsz,1,fp);
    fclose(fp);
}
Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #4 : 23-10-2003 07:32 » 

FILE* fp=fopen("filename", rb);  следует читать FILE* fp=fopen("filename", "rb");  Улыбаюсь
Записан
Пенсионер
Гость
« Ответ #5 : 23-10-2003 11:26 » 

Еще глупый вопрос...
А как узнать размер файла?
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #6 : 23-10-2003 11:28 » 

А вот это зависит от операционки и от компилятора!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 23-10-2003 12:07 » 

Цитата

А вот это зависит от операционки и от компилятора!


Не должно, есть в С функция, только не помню наизусть filesize или что то в этом роде... если не ошибаюсь
Записан

А птичку нашу прошу не обижать!!!
Пенсионер
Гость
« Ответ #8 : 23-10-2003 12:32 » 

Ну операционка то Win
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #9 : 23-10-2003 12:32 » 

Гром, -еще как зависит!
вот пример определения размера файла через указатель в нем (из BuilderHelp) - это более-менее универсально

#include <stdio.h>
long filesize(FILE *stream);
int main(void)
{
   FILE *stream;

   stream = fopen("MYFILE.TXT", "w+");
   fprintf(stream, "This is a test");
   printf("Filesize of MYFILE.TXT is %ld bytes\n", filesize(stream));
   fclose(stream);
   return 0;
}
long filesize(FILE *stream)
{
   long curpos, length;
   curpos = ftell(stream);
   fseek(stream, 0L, SEEK_END);
   length = ftell(stream);
   fseek(stream, curpos, SEEK_SET);
   return length;
}
Записан
Пенсионер
Гость
« Ответ #10 : 23-10-2003 12:41 » 

Ух....
А какнеть по компакней можно?
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #11 : 23-10-2003 12:52 » 

Migmile, от операционки зависит реализация стандартных библиотек, а не работа программиста со стандартными библиотеками.

А код по определению длины файла с использованием stdlib так и выглядет.
нету в этой либе стандартной функции определения длины файла. Жаль
Записан

Megabyte be with you!
ysv_
Помогающий

ua
Offline Offline

« Ответ #12 : 23-10-2003 13:31 » 

А как же long filelength(int) из io.h. Помоему это стандарт.
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #13 : 23-10-2003 13:38 » 

А не POSIX ли это стандарт?
Записан

Megabyte be with you!
Migmile
Помогающий

ru
Offline Offline

« Ответ #14 : 23-10-2003 13:39 » 

Lex, к сожалению, не все компиляторы полностью реализуют все функции!
ysv_, в стандарте нет упоминания filelength - специально посмотрел Улыбаюсь
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #15 : 23-10-2003 13:44 » 

Migmile, это уже вопрос совместимости компилятора со стандартом.
Записан

Megabyte be with you!
Пенсионер
Гость
« Ответ #16 : 23-10-2003 15:04 » 

Ещё одно почему ниже предоставленный код не читает русские буквы?
   int size;
   FILE* fp;
   fp=fopen(filename, "rb");
   fsize =  filesize(fp);
   
   if(fp)
   {
      size=fread(buf,1024,1,fp);
      fclose(fp);
   }
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #17 : 23-10-2003 15:21 » 

А как ты это проверял?
Записан

Megabyte be with you!
ysv_
Помогающий

ua
Offline Offline

« Ответ #18 : 23-10-2003 15:27 » 

To Migmile: А где смотрел? Я тоже хочу. А то я по доках bcc, mingw и cl смотрел - думал раз во всех - значит стандарт.

To Пенсионер: С чего вы взяли, что не читает? Он что их пропускает Я шокирован! ?
Чем проверяли?
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #19 : 23-10-2003 15:49 » 

ysv_, в доках кроме стандартных функций есть еще доп библиотеки.
пример socet функции тоже есть в доках, но они определны имено в POSIX, а не в стандарте ANSI C\C++
Записан

Megabyte be with you!
Diletant
Помогающий

de
Offline Offline

« Ответ #20 : 23-10-2003 16:03 » 

Цитата: Пенсионер
Ну операционка то Win


Если Win, то (хоть и не по теме форума)

          FindFirstFile("FileName", (WIN32_FIND_DATA*)pFindFileData);

И смотреть два соответствующих поля структуры (WIN32_FIND_DATA)
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #21 : 23-10-2003 16:54 » 

GetFileSize() еще проще...

Всем кому нужен стандарт - раздел файлы книги - лежит стандарт по С и по С++ уже давно.

Migmile, совершенно верно тебе Lex ответил...
С моей точки зрения GetFileSize() или FindFirstFile находят длину файла в Win32 NTFS WIN16 форматах дисков, они же работают в Win9x WinNT Win2k & WinXP.

stdlib.h io.h файлы хидеры, где описана стандартная (или не стандартная) форма функции, а lib содержит свои данные для суппортед ОС.

Так что - формально - определение размера файла зависит не столько от ОС - сколько от формата отформатированности диска, разрядности ОС (если это имелось в виду то от типа ОС), но при этом разница на уровне программиста на С не видна совершенно, ибо он вызывает одну и туже функцию!
Записан

А птичку нашу прошу не обижать!!!
Diletant
Помогающий

de
Offline Offline

« Ответ #22 : 23-10-2003 17:03 » 

Для GetFileSize()  файл еще открыть надо. Так что еще надо посмотреть, что проще.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #23 : 23-10-2003 17:08 » 

Diletant, это да - но я исходил из их кода - а там файл открывали Улыбаюсь Улыбаюсь  Ага
Записан

А птичку нашу прошу не обижать!!!
Migmile
Помогающий

ru
Offline Offline

« Ответ #24 : 24-10-2003 07:44 » 

Цитата

Так что - формально - определение размера файла зависит не столько от ОС - сколько от формата отформатированности диска, разрядности ОС (если это имелось в виду то от типа ОС), но при этом разница на уровне программиста на С не видна совершенно, ибо он вызывает одну и туже функцию!

Ну если по DOS,windows3.1,w2k и unix/linux используются одни и те-же функции для работы с файлами - ну кроме простейших,- то я извиняюсь Отлично  Отлично
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #25 : 24-10-2003 07:49 » new

По моему скромному мнению для работы с файлами правильнее и надежнее использовать функции самого низкого уровня, какие позволяет язык/операционка. Для W2k - createfile(). Все равно, рано или поздно, все функции языка свалятся на них!
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #26 : 24-10-2003 09:24 » 

Если не требуется переносимости.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #27 : 25-10-2003 10:52 » 

Есть функция fstat(int fd,struct stat * file_info)
Записан

Странно всё это....
DeltaFlight
Гость
« Ответ #28 : 26-10-2003 18:41 » 

Цитата: man stat
NAME
       stat, fstat, lstat - get file status

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int stat(const char *file_name, struct stat *buf);
       int fstat(int filedes, struct stat *buf);
       int lstat(const char *file_name, struct stat *buf);

DESCRIPTION
       These  functions  return  information about the specified file.
[...]
They all return a stat structure, which contains the following fields:

              struct stat {
                  dev_t         st_dev;      /* device */
                  ino_t         st_ino;      /* inode */
                  mode_t        st_mode;     /* protection */
                  nlink_t       st_nlink;    /* number of hard links */
                  uid_t         st_uid;      /* user ID of owner */
                  gid_t         st_gid;      /* group ID of owner */
                  dev_t         st_rdev;     /* device type (if inode device) */
                  off_t         st_size;     /* total size, in bytes */
                  unsigned long st_blksize;  /* blocksize for filesystem I/O */
                  unsigned long st_blocks;   /* number of blocks allocated */
                  time_t        st_atime;    /* time of last access */
                  time_t        st_mtime;    /* time of last modification */
                  time_t        st_ctime;    /* time of last change */
              };
The  value st_size gives the size of the file (if it is a regular file or a symlink) in bytes. The size of a symlink is the length of the pathname it  contains,  without trailing NUL.
[...]

CONFORMING TO
       The  stat  and fstat calls conform to SVr4, SVID, POSIX, X/OPEN, BSD 4.3.  The lstat call conforms to 4.3BSD and SVr4.


А функции /filesize/i нет ни в в POSIX, ни тем более в C Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 26-10-2003 19:38 » 

Цитата
А функции /filesize/i нет ни в в POSIX, ни тем более в C
А что, С это что-то большее чем язык? Причем тут ф-ии?
В Win есть все чего нет и не надо под *nix. Многое переименовано, продублированно, "расширено" и т.п.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines