Пенсионер
Гость
|
|
« : 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
Помогающий
Offline
|
|
« Ответ #4 : 23-10-2003 07:32 » |
|
FILE* fp=fopen("filename", rb); следует читать FILE* fp=fopen("filename", "rb");
|
|
|
Записан
|
|
|
|
Пенсионер
Гость
|
|
« Ответ #5 : 23-10-2003 11:26 » |
|
Еще глупый вопрос... А как узнать размер файла?
|
|
|
Записан
|
|
|
|
Migmile
Помогающий
Offline
|
|
« Ответ #6 : 23-10-2003 11:28 » |
|
А вот это зависит от операционки и от компилятора!
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #7 : 23-10-2003 12:07 » |
|
А вот это зависит от операционки и от компилятора!
Не должно, есть в С функция, только не помню наизусть filesize или что то в этом роде... если не ошибаюсь
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Пенсионер
Гость
|
|
« Ответ #8 : 23-10-2003 12:32 » |
|
Ну операционка то Win
|
|
|
Записан
|
|
|
|
Migmile
Помогающий
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
|
|
« Ответ #11 : 23-10-2003 12:52 » |
|
Migmile, от операционки зависит реализация стандартных библиотек, а не работа программиста со стандартными библиотеками. А код по определению длины файла с использованием stdlib так и выглядет. нету в этой либе стандартной функции определения длины файла.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #12 : 23-10-2003 13:31 » |
|
А как же long filelength(int) из io.h. Помоему это стандарт.
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #13 : 23-10-2003 13:38 » |
|
А не POSIX ли это стандарт?
|
|
|
Записан
|
Megabyte be with you!
|
|
|
Migmile
Помогающий
Offline
|
|
« Ответ #14 : 23-10-2003 13:39 » |
|
Lex, к сожалению, не все компиляторы полностью реализуют все функции! ysv_, в стандарте нет упоминания filelength - специально посмотрел
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #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
|
|
« Ответ #17 : 23-10-2003 15:21 » |
|
А как ты это проверял?
|
|
|
Записан
|
Megabyte be with you!
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #18 : 23-10-2003 15:27 » |
|
To Migmile: А где смотрел? Я тоже хочу. А то я по доках bcc, mingw и cl смотрел - думал раз во всех - значит стандарт. To Пенсионер: С чего вы взяли, что не читает? Он что их пропускает ? Чем проверяли?
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #19 : 23-10-2003 15:49 » |
|
ysv_, в доках кроме стандартных функций есть еще доп библиотеки. пример socet функции тоже есть в доках, но они определны имено в POSIX, а не в стандарте ANSI C\C++
|
|
|
Записан
|
Megabyte be with you!
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #20 : 23-10-2003 16:03 » |
|
Ну операционка то Win Если Win, то (хоть и не по теме форума) FindFirstFile("FileName", (WIN32_FIND_DATA*)pFindFileData); И смотреть два соответствующих поля структуры (WIN32_FIND_DATA)
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
Помогающий
Offline
|
|
« Ответ #22 : 23-10-2003 17:03 » |
|
Для GetFileSize() файл еще открыть надо. Так что еще надо посмотреть, что проще.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #23 : 23-10-2003 17:08 » |
|
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Migmile
Помогающий
Offline
|
|
« Ответ #24 : 24-10-2003 07:44 » |
|
Так что - формально - определение размера файла зависит не столько от ОС - сколько от формата отформатированности диска, разрядности ОС (если это имелось в виду то от типа ОС), но при этом разница на уровне программиста на С не видна совершенно, ибо он вызывает одну и туже функцию!
Ну если по DOS,windows3.1,w2k и unix/linux используются одни и те-же функции для работы с файлами - ну кроме простейших,- то я извиняюсь
|
|
|
Записан
|
|
|
|
Migmile
Помогающий
Offline
|
|
« Ответ #25 : 24-10-2003 07:49 » |
|
По моему скромному мнению для работы с файлами правильнее и надежнее использовать функции самого низкого уровня, какие позволяет язык/операционка. Для W2k - createfile(). Все равно, рано или поздно, все функции языка свалятся на них!
|
|
|
Записан
|
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #26 : 24-10-2003 09:24 » |
|
Если не требуется переносимости.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #27 : 25-10-2003 10:52 » |
|
Есть функция fstat(int fd,struct stat * file_info)
|
|
|
Записан
|
Странно всё это....
|
|
|
DeltaFlight
Гость
|
|
« Ответ #28 : 26-10-2003 18:41 » |
|
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
|
|
« Ответ #29 : 26-10-2003 19:38 » |
|
А функции /filesize/i нет ни в в POSIX, ни тем более в C А что, С это что-то большее чем язык? Причем тут ф-ии? В Win есть все чего нет и не надо под *nix. Многое переименовано, продублированно, "расширено" и т.п.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|