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

Массив из файла С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Garred
 Аватар для Garred
279 / 77 / 4
Регистрация: 19.04.2011
Сообщений: 217
14.11.2011, 23:30     Массив из файла С++ #1
Уважаемые форумчане, пишу программу, которая находит максимальный элемент массива, записанного в файле.
Вот такая реализация:

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 <fstream.h>
 
main ()
{
    ifstream fin ("1.in");
    ofstream fout ("1.out");
    int n, bank;
    double mas[10], max;
 
    fin>>n;
    for (int i=0;i<n;i++)
        fin>>mas[i];
        max=mas[0];
        bank=1;
    for (i=0;i<n;i++)
    {
        if (mas[i]>max)
        {
            max=mas[i];
            bank=i+1;
        }
    }
    fout<<bank;
    return 0;
}
Входной файл выглядит примерно так.

5
12.11 12.14 12.17 12.12 12.13

Где 5 количество элементов

В выходной файл записывается номер максимального числа

Теперь мне надо сделать так, чтобы входной файл не содержал количество элементов массива, а только сами элементы, записанные в одну строку.
Помогите реализовать. Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 23:30     Массив из файла С++
Посмотрите здесь:

Нужно записать массив в файл, а потом из этого файла считать этот же массив C++
массив из файла C++
C++ пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки.
Файлы и массив (сделать так, чтобы массив заполнялся значениями из этого же файла) C++
C++ Чтение из файла в массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TwiX
59 / 59 / 1
Регистрация: 27.10.2011
Сообщений: 189
15.11.2011, 03:54     Массив из файла С++ #2
Теперь два варианта. Либо пробежаться два раза по файлу (первый для подсчёта количества элементов), либо использовать динамическую структуру (vector, например).
Bers
Заблокирован
15.11.2011, 03:58     Массив из файла С++ #3
Цитата Сообщение от Garred Посмотреть сообщение
Теперь мне надо сделать так, чтобы входной файл не содержал количество элементов массива, а только сами элементы, записанные в одну строку.
Помогите реализовать. Заранее спасибо.
1. Узнать количество байт, которое занимает файл
2. Узнать количество байт, которое занимает один элемент записанный в файл.
3. Количество элементов в файле = вес файла/ вес элемента.

4. Профит!
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
15.11.2011, 04:26     Массив из файла С++ #4
Цитата Сообщение от Bers Посмотреть сообщение
2. Узнать количество байт, которое занимает один элемент записанный в файл.
полагаю что если числа будут разной длины, (5 цифр, 3 цифры и т.д.) то их размеры (в байтах) будут разные.
Bers
Заблокирован
15.11.2011, 04:27     Массив из файла С++ #5
Цитата Сообщение от TwiX Посмотреть сообщение
Теперь два варианта. Либо пробежаться два раза по файлу (первый для подсчёта количества элементов), либо использовать динамическую структуру (vector, например).
Оба варианта ущербны.

Первый - потому что двойная работа.
Зачем делать дважды то, что можно сделать за один раз?

Чтение из файла итак операция дорогостоящая, и желательно данные сразу всем скопом считывать, что бы поменьше к харду обращаться. А вы предлагаете целый цикл пустить в холостую.

Второй вариант ущербный, потому будит вызывать дорогостоящий реалок вектора. Для большого файла получится неоправданно дорогостоящие реалоки, с прорвой выброшенной на ветер памяти.


Есть третий вариант: Узнать заранее, сколько элементов содержится в файле.
Создать вектор сразу нужного размера. И закачать в него все данные сразу одним скопом (не в цикле по-элементно, а сразу весь файл целиком).

Потом уже работать не с самим файлом, который на диске, и доступ к которому медленный.
А с вектором, который в памяти, и доступ к данным будит быстрым.

Запись данных - аналогично. Записать за один раз сразу весь вектор целиком, а не по-элементно.

/зы Автор! Гугли "работа с файлами с++" "работа с бинарными файлами с++" "произвольный доступ к файлу с++"

Добавлено через 56 секунд
Цитата Сообщение от greeezz Посмотреть сообщение
полагаю что если числа будут разной длины, (5 цифр, 3 цифры и т.д.) то их размеры будут разные.
Полагаю, что элемент имеет тип. И этот тип - фиксирован.

Если тип элемента - int, то он всегда будит весить строго sizeof(int)
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
15.11.2011, 04:32     Массив из файла С++ #6
Цитата Сообщение от Bers Посмотреть сообщение
Полагаю, что элемент имеет тип. И этот тип - фиксирован.
Если тип элемента - int, то он всегда будит весить строго sizeof(int)
создайте файл в котором будет число 1.11 и посмотрите размер.
создайте файл в котором будет 11.11 и посмотрите размер.
в итоге если у меня в файле три числа, например 1.11 и 11.11 и 111.11то как посчитать количество элементов по размеру одного из них.
Bers
Заблокирован
15.11.2011, 04:38     Массив из файла С++ #7
Цитата Сообщение от greeezz Посмотреть сообщение
создайте файл в котором будет число 1.11 и посмотрите размер.
создайте файл в котором будет 11.11 и посмотрите размер.
в итоге если у меня в файле три числа, например 1.11 и 11.11 и 111.11то как посчитать количество элементов по размеру одного из них.
Вам тоже не мешает погуглить "бинарный режим файла с++" "произвольный доступ к файлу с++"

Потому что вы путаете понятие "количество байт, которое занимает тип данных" с понятием "буковки вместо данных, которые запихивают в файл, открытый в текстовом режиме"

Если я создам файл, и запишу в него элемент ТИПА double
то какие бы значения типа double я не подставлял - размер файла не изменится.

Поймите одну простую вещь:

int a=5; весит абсолютно столько же, сколько int b=500

оби переменные весят sizeof(int);
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
15.11.2011, 04:57     Массив из файла С++ #8
Bers, я всего лишь пытаюсь следовать вашим инструкциям которые вы указали выше и для себя разобраться в том что мне интересно.
sizeof(double) = 8.
если у меня в файле три числа которые визуально представляют из себя double 1.11 11.11 11.11, то мой файл будет иметь размер 16 байт.
если следовать вашим инструкциям я должен разделить 16 на 8 и получить 2. что не верно. т.к. у меня три числа. вот и все.

з.ы. я обязательно погуглю и найду нужные мне ответы. ваша инструкция выше кроме как на выполненные мной шаги, к сожалению, больше ни на что меня не наводит.
Bers
Заблокирован
15.11.2011, 05:04     Массив из файла С++ #9
Цитата Сообщение от greeezz Посмотреть сообщение
sizeof(double) = 8.
если у меня в файле три числа которые визуально представляют из себя double 1.11 11.11 11.11, то мой файл будет иметь размер 16 байт.
если следовать вашим инструкциям я должен разделить 16 на 8 и получить 2. что не верно. т.к. у меня три числа. вот и все.
Ещё раз вам говорю: вы путаете текстовый файл и бинарный.

В текстовом файле нет никаких доублов. Есть только текст. И цыферки в текстовом файле записываются как последовательности символов.
Размер текстового файла естественно зависит от того, какой текст туда закачали.

бинарный Файл с 3мя элементами типа доубл всегда будит весить 24 байта. Не важно, какие значения будут у этих элементов.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
15.11.2011, 05:13     Массив из файла С++ #10
Цитата Сообщение от Bers Посмотреть сообщение
бинарный Файл с 3мя элементами типа доубл всегда будит весить 24 байта
совершенно верно. потому что в нем три числа будут записаны условно говоря так: 00001011 00010001 00101001 ну только в 8 раз длиннее
Цитата Сообщение от Bers Посмотреть сообщение
В текстовом файле нет никаких доублов.
о чем и речь. товарищ Garred, в своем коде работает с текстовым файлов а не с бинарным. моя ремарка была именно по этому поводу.
Bers
Заблокирован
15.11.2011, 05:29     Массив из файла С++ #11
Цитата Сообщение от greeezz Посмотреть сообщение
о чем и речь. товарищ Garred, в своем коде работает с текстовым файлов а не с бинарным. моя ремарка была именно по этому поводу.
А....

Ну если очень хочется, что бы работа шла именно с текстовым файлом - можно просто определить его структуру. Например, содержимое текстовика имеет вид:
12.11
12.14
12.17
12.12
12.13

Если формат файла гарантирует, что каждый элемент в текстовом виде имеет строго 5 байт (2 на целую часть, два на дробную, и один на символ точки)
То можно считать что вес элемента - строго 5 байт. А дальше все как обычно.

Единственное: придётся гарантировать, что ноль это 00.00, а не просто 0


Другой способ:
1 Узнаём вес текстового файла.
2 Создаём стринг нужного размера (что бы избежать реалоков)
3. Закачивает весь текстовик целиком в стринг.
4. Анализируем полученный массив чаров.

В текстовом файле невозможно подсчитать количество строк, не подсчитав количество символов '\n' Ну или, невозможно подсчитать количество слов, не подсчитав количество символов ' ', '\n', '\0' и тд

Но вообще то, если хочется быструю работу - то лучше юзать бинарный файл.
А так любой файл посерьёзнее (ну взять хотя бы файлы bmp) имеют шапку. Которая имеет фиксированный размер, и в которой прописываются все необходимые служебные данные для быстрого чтения файла.
Garred
 Аватар для Garred
279 / 77 / 4
Регистрация: 19.04.2011
Сообщений: 217
15.11.2011, 08:07  [ТС]     Массив из файла С++ #12
Bers, дело в том, что в текстовом файлеe приблизительные курсы перевода доллара в рубль. То есть вида 30.24 Два знака целой части, точка, два знака дробной части. Их количество случайное, а записывать в исходный файл их можно либо в строку через пробел, либо построчно (в столбик). Если кто-то сможет переделать мой код,так как я спрашивал в первом сообщении(без количества элементов в файле) то буду очень благодарен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 11:24     Массив из файла С++
Еще ссылки по теме:

C++ Массив структур из файла
Строку из файла в массив C++
Чтение из файла в массив C++

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

Или воспользуйтесь поиском по форуму:
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
15.11.2011, 11:24     Массив из файла С++ #13
C++
1
2
3
4
double temp;
vector<double> vec;
while (fin>>temp)
    vec.push_back(temp);
Я не думаю, что автору этот вариант сильно замедлит программу.
Если же сам массив не нужен, только максимальный элемент, то можно вообще обойтись без вектора (работает при условии, что минимум один элемент в файле таки записан, иначе надо будет немного переделать):
C++
1
2
3
4
5
double max, temp;
fin>>max;
while (fin>>temp)
    if (max < temp)
        max = temp;
Yandex
Объявления
15.11.2011, 11:24     Массив из файла С++
Ответ Создать тему
Опции темы

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