Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Чтение из файла в С++ в стиле C
- *
- * Продвинутый вариант с попыткой уйти от ограничений
- * по максимальному размеру считываемого массива
- *
- * Версия 1 - экономно по скорости, расточительно - по памяти
- * (дублирование в стиле C++ затруднительно - нет аналога realloc)
- */
- #include <stdio.h>
- #include <stdlib.h> // для malloc, realloc, free
- int fsize(FILE * fd) // Определить размер файла - нетривиальная
- { // задача, особенно кроссплатформенно. Здесь:
- int cur = ftell(fd); // сохранить текущую позицию в файле (2)
- fseek(fd, 0, SEEK_END); // переместиться в конец файла
- int size = ftell(fd); // выяснить размер
- fseek(fd, cur, SEEK_SET); // вернуть файловый курсор на место
- return size;
- }
- int main()
- {
- FILE * fd = fopen("file_name.txt", "r");
- if (!fd)
- {
- printf("File not found\n");
- return 1;
- }
- // максимально возможное количество числовых значений в файле
- int maxSize = (fsize(fd) + 1) / 2;
- // выделение области динамической памяти для размещения в ней
- // массива из maxSize элементов sizeof() байт размером каждый
- // (malloc возвращает нетипизированный указатель типа void*,
- // который необходимо привести к int*)
- //
- int * array = (int*) malloc(maxSize * sizeof(int));
- if (!array)
- {
- printf("Not enough memory\n");
- return 2;
- }
- int size = 0;
- while (size < maxSize && fscanf(fd, "%d", &array[size]) != EOF)
- size++;
- fclose(fd);
- // Перераспределение памяти с целью освободить избыточный резерв
- // (теперь известен реальный размер массива)
- array = (int*) realloc(array, size * sizeof(int));
- for (int i = 0; i < size; i++)
- printf("%d ", array[i]);
- putchar('\n');
- free(array); // освобождение памяти
- return 0;
- }
- /**
- * (2)
- * Существует понятие курсора в файле - он указывает на позицию, с
- * с которой и будет осуществляться следующая операция с файлом -
- * чтение, запись или усечение. Чтение или запись сдвигает курсор
- * к концу файла. Получить текущую позицию курсора можно функцией
- * ftell(FILE * fd), а установить позицию вручную - функцией
- * fseek(FILE * fd, int offset, int from), где
- * from - откуда вести отсчет (SEEK_SET - от начала файла,
- * SEEK_CUR - от текущей позиции,
- * SEEK_END - от конца файла)
- * offset - смещение относительно from
- */
Add Comment
Please, Sign In to add comment