Guest User

Untitled

a guest
Aug 16th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. /**
  2. * Чтение из файла в С++ в стиле C
  3. *
  4. * Продвинутый вариант с попыткой уйти от ограничений
  5. * по максимальному размеру считываемого массива
  6. *
  7. * Версия 1 - экономно по скорости, расточительно - по памяти
  8. * (дублирование в стиле C++ затруднительно - нет аналога realloc)
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h> // для malloc, realloc, free
  13.  
  14. int fsize(FILE * fd) // Определить размер файла - нетривиальная
  15. { // задача, особенно кроссплатформенно. Здесь:
  16. int cur = ftell(fd); // сохранить текущую позицию в файле (2)
  17. fseek(fd, 0, SEEK_END); // переместиться в конец файла
  18. int size = ftell(fd); // выяснить размер
  19. fseek(fd, cur, SEEK_SET); // вернуть файловый курсор на место
  20. return size;
  21. }
  22.  
  23. int main()
  24. {
  25. FILE * fd = fopen("file_name.txt", "r");
  26. if (!fd)
  27. {
  28. printf("File not found\n");
  29. return 1;
  30. }
  31. // максимально возможное количество числовых значений в файле
  32. int maxSize = (fsize(fd) + 1) / 2;
  33. // выделение области динамической памяти для размещения в ней
  34. // массива из maxSize элементов sizeof() байт размером каждый
  35. // (malloc возвращает нетипизированный указатель типа void*,
  36. // который необходимо привести к int*)
  37. //
  38. int * array = (int*) malloc(maxSize * sizeof(int));
  39. if (!array)
  40. {
  41. printf("Not enough memory\n");
  42. return 2;
  43. }
  44. int size = 0;
  45. while (size < maxSize && fscanf(fd, "%d", &array[size]) != EOF)
  46. size++;
  47. fclose(fd);
  48. // Перераспределение памяти с целью освободить избыточный резерв
  49. // (теперь известен реальный размер массива)
  50. array = (int*) realloc(array, size * sizeof(int));
  51.  
  52. for (int i = 0; i < size; i++)
  53. printf("%d ", array[i]);
  54. putchar('\n');
  55.  
  56. free(array); // освобождение памяти
  57.  
  58. return 0;
  59. }
  60.  
  61. /**
  62. * (2)
  63. * Существует понятие курсора в файле - он указывает на позицию, с
  64. * с которой и будет осуществляться следующая операция с файлом -
  65. * чтение, запись или усечение. Чтение или запись сдвигает курсор
  66. * к концу файла. Получить текущую позицию курсора можно функцией
  67. * ftell(FILE * fd), а установить позицию вручную - функцией
  68. * fseek(FILE * fd, int offset, int from), где
  69. * from - откуда вести отсчет (SEEK_SET - от начала файла,
  70. * SEEK_CUR - от текущей позиции,
  71. * SEEK_END - от конца файла)
  72. * offset - смещение относительно from
  73. */
Add Comment
Please, Sign In to add comment