Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
#1

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

25.12.2013, 19:44. Просмотров 2511. Ответов 11
Метки нет (Все метки)

Доброго времени суток.
Столкнулся вот с проблемой не пойму в чем дело. Нужно из текстового файла считать целочисленный массив.
Пользуюсь функцией 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();
 
}
Вместо значений мне выводится какой то хлам. Подскажите пожалуйста, что я делаю не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2013, 19:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция fread не считывает данные (C++):

Fread неправильно считывает файл - C++
У меня есть файл вот его скрин в hex редакторе я пытаюсь считать первые 8 байт, вот код: fread(&amp;formCk.ckID,4, 1, file_in);...

Функция дважды считывает данные - C++
собственно возникла проблема связанная с тем, что при выборе ввода массива вручную считается и определяется сумма элементов для ручного...

Функция fread и матрицы - C++
Подскажите, как правильно исп. эту ф-ию для считывания информации из файла в матрицу. Есть маленькая программка, которая никак не хочет...

Функция fread плохо работает с типом string - C++
Всем доброго времени суток. У меня возникла проблема с чтением из файла. Я храню информацию в виде структуры. struct PC { string...

Не считывает данные - C++
Почему программа выводит начальное значение double? как подкорректиовать программу,чтоб выводилось тоже самое что я и ввел? #include...

Функция getline не считывает пробелы - C++
Написал код программы для вывода из файла строк, где есть двузначные цифры. Пользовался функцией getline. Но указанные в процессе работы...

11
Evg
Эксперт CАвтор FAQ
18915 / 6874 / 503
Регистрация: 30.03.2009
Сообщений: 19,359
Записей в блоге: 30
26.12.2013, 16:09 #2
Покажи свой файл, покажи, что за хлам. fread читает "сырые" данные (т.е. набор байтов), а ты хочешь их распечатать как целочисленные величины
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
26.12.2013, 16:28 #3
freemanc,
C++
1
fseek(read, 0, SEEK_END);
А почему SEEK_END?
0
Kuzia domovenok
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,834
Записей в блоге: 1
26.12.2013, 16:39 #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?!!!
2
outoftime
║XLR8║
756 / 656 / 88
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
26.12.2013, 16:41 #5
freemanc, fscanf в помощь http://en.cppreference.com/w/cpp/io/c/fscanf
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
26.12.2013, 16:41 #6
Kuzia domovenok, ах, что-то не заметил совсем
0
freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
27.12.2013, 22:16  [ТС] #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);
...
0
Kuzia domovenok
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,834
Записей в блоге: 1
27.12.2013, 22:44 #8
freemanc, да, файл должна создавать аналогичная программа с помощью fwrite. Либо альтернативный способ, как я выше сказал, найди себе hex редактор и вбивай в нём информацию последовательно по одному байту в виде 16ричных чисел. Один int четыре байта.
1
Evg
Эксперт CАвтор FAQ
18915 / 6874 / 503
Регистрация: 30.03.2009
Сообщений: 19,359
Записей в блоге: 30
28.12.2013, 00:30 #9
Цитата Сообщение от freemanc Посмотреть сообщение
Evg, Kuzia domovenok, файл был создан как обычный текстовый, в блокноте, заполнен числами от 0 до 9 построчно. Я так понял, лучше сначала его создать через fwrite в бинарном режиме, а потом уже что то делать, верно?
Скажем так, это один из вариантов, самый простой. Причём опять ты делаешь одну и ту же ошибку. Третьим параметром в fwrite должно быть количество элементов (т.е. 10). Т.е. суммарный размер - это второй параметр помножить на третий параметр
1
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
28.12.2013, 01:15 #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 "Язык программирования Си" Д.Ритчи, Б.Керниган
1
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 03:17 #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();
1
outoftime
║XLR8║
756 / 656 / 88
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
28.12.2013, 03:51 #12
freemanc, http://en.cppreference.com/w/cpp/io/basic_istream/read Вы же на С++ пишете.
1
28.12.2013, 03:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 03:51
Привет! Вот еще темы с ответами:

Не считывает данные из файла - C++
Дано задание (полностью писать не буду не имеет смысла) &quot;... также создать функции ввода и вывода массива из файла SaveArray и LoadArray.&quot;...

Считывает ли функция fgets строку посимвольно? - C++
Проконсультируйте пожалуйста. Смотрите данная функция имеет три аргумента: //Первый из трех аргументов функции является указателем на...

Программа не считывает введенные данные - C++
Программа не считывает введенные данные. Помогите, пожалуйста, не вижу, где проблема) #include &lt;iostream&gt;//файловый ввод вывод ...

Функция,которая считывает из файла только n последних строк - C++
Привет! Подскажите как прописать функцию, перед этим уже прописала потоковое чтение из файла и посчитала количество строк в файле. Спасибо!


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru