Форум программистов, компьютерный форум CyberForum.ru

Функция fread не считывает данные - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
25.12.2013, 19:44     Функция fread не считывает данные #1
Доброго времени суток.
Столкнулся вот с проблемой не пойму в чем дело. Нужно из текстового файла считать целочисленный массив.
Пользуюсь функцией fread :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
void main()
{
    char dir[100] ="";
    cout<<"Enter the path of file: ";
    cin>>dir;
    FILE *read = fopen(dir, "r");
    fseek(read, 0, SEEK_END);
    int fsize = ftell(read);
    fseek(read, 0, SEEK_SET);
    int *numbers = new int[fsize];
 
    fread(numbers, fsize, 10, read);
    cout<<numbers[0]<<endl;
    cout<<numbers[5]<<endl;
    cout<<numbers[2]<<endl;
 
    fclose(read);
    getch();
 
}
Вместо значений мне выводится какой то хлам. Подскажите пожалуйста, что я делаю не так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
26.12.2013, 16:09     Функция fread не считывает данные #2
Покажи свой файл, покажи, что за хлам. fread читает "сырые" данные (т.е. набор байтов), а ты хочешь их распечатать как целочисленные величины
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
26.12.2013, 16:28     Функция fread не считывает данные #3
freemanc,
C++
1
fseek(read, 0, SEEK_END);
А почему SEEK_END?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
26.12.2013, 16:39     Функция fread не считывает данные #4
kventin_zhuk, это он узнаёт размер файла
freemanc, ты определись вообще, у тебя текстовый файл или двоичный?
если текстовый, то зачем используешь fread?
если двоичный, то он точно двоичный? Ты его как обычно в блокноте создавал? Или всё же ты взял hex редактор и прописал туда четырёхбайтовые целые?

Добавлено через 2 минуты
Цитата Сообщение от freemanc Посмотреть сообщение
int *numbers = new int[fsize];
почему new[fsize]? Вообще-то new int[fsize/4]!
int занимает 4 байта обычно.

Добавлено через 1 минуту
Цитата Сообщение от freemanc Посмотреть сообщение
fread(numbers, fsize, 10, read);
LOL! что такое 10 и какую роль тут играет fsize? Погугли ещё раз, какие аргументы стоят на 2м и 3м месте у функции fread?!!!
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
26.12.2013, 16:41     Функция fread не считывает данные #5
freemanc, fscanf в помощь http://en.cppreference.com/w/cpp/io/c/fscanf
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
26.12.2013, 16:41     Функция fread не считывает данные #6
Kuzia domovenok, ах, что-то не заметил совсем
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
27.12.2013, 22:16  [ТС]     Функция fread не считывает данные #7
Я прошу прощения, что вызвал у всех недоумение глупостью написанного, но поймите меня правильно - я не смог до конца разобраться с этой функцией, поэтому и решил спросить у знающих людей.
Разложу все по полочкам:
Появилась необходимость считать содержимое файла в массив одним махом (то есть без использования цикла).
Работа должна вестись с бинарным файлом. Я не совсем понимаю зачем такие файлы нужны и в каких случаях используются, единственное, что я действительно про них знаю, это то, что в отличии от текстовых, они не хранят управляющих элементов и представляют собой просто последовательность байтов. (По этому и работал с ним как с текстовым, что бы посмотреть как что работает)
На ум приходила только функция fread. Ознакомившись с синтаксисом, я сразу не допер, что она работает исключительно с бинарными файлами, а в качестве параметров принимает размер в Байтах. Если я правильно понял, то в моем случае нужно открыть файл в режиме бинарного чтения и правильно задать параметры:
C++
1
2
3
4
5
6
7
8
9
10
    //Открываем файл в режиме бинарного чтения:
    FILE *read = fopen(dir, "rb");
   /* Определяем размер файла в БАЙТАХ, определяя разницу между значениями файлового указателя в начале и  конце файла */
    fseek(read, 0, SEEK_END);
    int fsize = ftell(read);
    fseek(read, 0, SEEK_SET);
   //Объявляем целочисленный массив полученного размера, разделенного на 4 (4 байта у int элемента)
    int *numbers = new int[fsize/4];
   //Считываем данные в массив.
    fread(numbers, sizeof(int), fsize/4, read);
Объясните пожалуйста, что имеется ввиду под третьим параметром функции fread - count (в моем случае указан fsize/4). Не могу вкурить никак)

Evg, Kuzia domovenok, файл был создан как обычный текстовый, в блокноте, заполнен числами от 0 до 9 построчно. Я так понял, лучше сначала его создать через fwrite в бинарном режиме, а потом уже что то делать, верно?
C++
1
2
3
4
5
int temp[] = {0,1,2,3,4,5,6,7,8,9};
FILE* write = fopen("1.txt", "wb");
fwrite(temp, sizeof(int), sizeof(temp), write);
fclose(write);
...
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
27.12.2013, 22:44     Функция fread не считывает данные #8
freemanc, да, файл должна создавать аналогичная программа с помощью fwrite. Либо альтернативный способ, как я выше сказал, найди себе hex редактор и вбивай в нём информацию последовательно по одному байту в виде 16ричных чисел. Один int четыре байта.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
28.12.2013, 00:30     Функция fread не считывает данные #9
Цитата Сообщение от freemanc Посмотреть сообщение
Evg, Kuzia domovenok, файл был создан как обычный текстовый, в блокноте, заполнен числами от 0 до 9 построчно. Я так понял, лучше сначала его создать через fwrite в бинарном режиме, а потом уже что то делать, верно?
Скажем так, это один из вариантов, самый простой. Причём опять ты делаешь одну и ту же ошибку. Третьим параметром в fwrite должно быть количество элементов (т.е. 10). Т.е. суммарный размер - это второй параметр помножить на третий параметр
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
28.12.2013, 01:15     Функция fread не считывает данные #10
Цитата Сообщение от freemanc Посмотреть сообщение
Появилась необходимость считать содержимое файла в массив одним махом (то есть без использования цикла).
Насколько я знаю, одним махом и переносимо не получится, но для POSIX-совместимых OS есть панацеи это точно.
Ввод-вывод основан на системных вызовах read и write, к которым программа на Си обращается с помощью функций с именами read() и write().
Для обеих первым аргументом является дескриптор файла. Во втором аргументе указывается массив символов вашей программы, куда посылаются или откуда берутся данные. Третий аргумент — это количество пересылаемых байтов.

Обе функции возвращают число переданных байтов. При чтении количество прочитанных байтов может оказаться меньше числа, указанного в третьем аргументе. Нуль означает конец файла, а –1 сигнализирует о какой-то ошибке. При записи функция возвращает количество записанных байтов, и если это число не совпадает с требуемым, следует считать, что запись не произошла.

Например, чтобы без буферизации "одним махом" перенаправить стандартный ввод на вывод:
C
1
2
3
4
5
6
7
8
9
10
#define BUFSIZ 4096
int main()
{
      char buf[BUFSIZ];
      int n;
 
      while ((n = read(0, buf, BUFSIZ)) > 0)
          write(i, buf, n);
      return 0;
}
Вот, например, как упрощенно устроена функция getchar() из стандартной библиотеки:
C
1
2
3
4
5
6
7
/* getchar: небуферизованный ввод одного символа */
  int getchar(void)
  {
      char c;
 
      return (read(0, &c, 1) == 1) ? (unsigned char) c : EOF;
  }
А вот и буферизованный вариант для общего развития:
C
1
2
3
4
5
6
7
8
9
10
11
12
int getchar(void)
  {
      static char buf[BUFSIZ];
      static char *bufp = buf;
      static int n = 0;
 
      if (n == 0) {   /* буфер пуст */
          n = read(0, buf, sizeof(buf));
          bufp = buf;
      }
      return (--n >= 0) ? (unsigned char) *bufp++ : EOF;
  }
Если интересно, то курите man 2 read или man 2 write, а лучше
Источник: гл.8 "Язык программирования Си" Д.Ритчи, Б.Керниган
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 03:17     Функция fread не считывает данные #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int temp[] = {0,1,2,3,4,5,6,7,8,9};
    //Открываем файл в режиме бинарной записи:
    FILE* write = fopen(dir, "wb");
    // Записываем массив в файл
    //fwrite(temp, sizeof(int), sizeof(temp), write);
    fwrite(temp, sizeof(temp), 1, write);
    fclose(write);
    //Открываем файл в режиме бинарного чтения:
    FILE *read = fopen(dir, "rb");
    if (!read) cout << "Error opening the file for reading!" << endl;
    else
    {
       /* Определяем размер файла в БАЙТАХ, определяя разницу между значениями файлового указателя в начале и конце файла */
        fseek(read, 0, SEEK_END);
        int fsize = ftell(read);
        fseek(read, 0, SEEK_SET);
        // Определяем количество int в файле
        int num = fsize / sizeof(int);
        //Объявляем целочисленный массив под количество int в файле
        int *numbers = new int[num];
       //Считываем данные в массив.
        fread(numbers, sizeof(int), num, read);
        //fread(numbers, fsize, 10, read);
        // Выводим содержимео массива
        for (int i  = 0; i < num; ++i)
            cout << numbers[i] << endl;
    
        fclose(read);
    }
    getch();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 03:51     Функция fread не считывает данные
Еще ссылки по теме:

C++ Не считывает данные
C++ Не считывает данные из файла
Программа не считывает введенные данные C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
28.12.2013, 03:51     Функция fread не считывает данные #12
freemanc, http://en.cppreference.com/w/cpp/io/basic_istream/read Вы же на С++ пишете.
Yandex
Объявления
28.12.2013, 03:51     Функция fread не считывает данные
Ответ Создать тему
Опции темы

Текущее время: 07:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru