Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Garred
282 / 80 / 7
Регистрация: 19.04.2011
Сообщений: 223

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

14.11.2011, 23:30. Показов 2208. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, пишу программу, которая находит максимальный элемент массива, записанного в файле.
Вот такая реализация:

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 количество элементов

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

Теперь мне надо сделать так, чтобы входной файл не содержал количество элементов массива, а только сами элементы, записанные в одну строку.
Помогите реализовать. Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2011, 23:30
Ответы с готовыми решениями:

Как создать массив строк, считывая данные из файла (сортировка данных из файла)
Доброго времени суток мне нужно отсортировать по алфавиту слова , которые содержатся в файле #include &lt;iostream&gt; #include ...

Заполнить динамический массив из файла и записать массив обратно в файл
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)

Заполнить массив строк из файла. Массив заполняется, но выводится не корректно
Здравствуйте! Такая проблема. В файле имена записаны в столбик и разделены точкой с запятой. Массив заполняется, но выводится не корректно....

12
60 / 60 / 10
Регистрация: 27.10.2011
Сообщений: 185
15.11.2011, 03:54
Теперь два варианта. Либо пробежаться два раза по файлу (первый для подсчёта количества элементов), либо использовать динамическую структуру (vector, например).
0
Заблокирован
15.11.2011, 03:58
Цитата Сообщение от Garred Посмотреть сообщение
Теперь мне надо сделать так, чтобы входной файл не содержал количество элементов массива, а только сами элементы, записанные в одну строку.
Помогите реализовать. Заранее спасибо.
1. Узнать количество байт, которое занимает файл
2. Узнать количество байт, которое занимает один элемент записанный в файл.
3. Количество элементов в файле = вес файла/ вес элемента.

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

бинарный Файл с 3мя элементами типа доубл всегда будит весить 24 байта. Не важно, какие значения будут у этих элементов.
0
278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441
15.11.2011, 05:13
Цитата Сообщение от Bers Посмотреть сообщение
бинарный Файл с 3мя элементами типа доубл всегда будит весить 24 байта
совершенно верно. потому что в нем три числа будут записаны условно говоря так: 00001011 00010001 00101001 ну только в 8 раз длиннее
Цитата Сообщение от Bers Посмотреть сообщение
В текстовом файле нет никаких доублов.
о чем и речь. товарищ Garred, в своем коде работает с текстовым файлов а не с бинарным. моя ремарка была именно по этому поводу.
0
Заблокирован
15.11.2011, 05:29
Цитата Сообщение от 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) имеют шапку. Которая имеет фиксированный размер, и в которой прописываются все необходимые служебные данные для быстрого чтения файла.
1
 Аватар для Garred
282 / 80 / 7
Регистрация: 19.04.2011
Сообщений: 223
15.11.2011, 08:07  [ТС]
Bers, дело в том, что в текстовом файлеe приблизительные курсы перевода доллара в рубль. То есть вида 30.24 Два знака целой части, точка, два знака дробной части. Их количество случайное, а записывать в исходный файл их можно либо в строку через пробел, либо построчно (в столбик). Если кто-то сможет переделать мой код,так как я спрашивал в первом сообщении(без количества элементов в файле) то буду очень благодарен.
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
15.11.2011, 11:24
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;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2011, 11:24
Помогаю со студенческими работами здесь

Файлы и массив (сделать так, чтобы массив заполнялся значениями из этого же файла)
Здравствуйте.Помогите пожалуйста с задачкой.Я сделал так что бы массив выводился в файл.Каждый элемент массива выводится на новую строку в...

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла
задача: передать динамический массив в функцию, и записать в каждый элемент строку из файла. количество строк известно вот что у меня...

Нужно записать массив в файл, а потом из этого файла считать этот же массив
Помогите, пожалуйста, никогда с файлами делов не имела. Нужно записать массив в файл, а потом из этого файла считать этот же массив. ...

Считывание файла в массив и запись нового файла
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Создать массив структур Название файла, объем файла, дата создания
Создать массив структур Название файла, объем файла, дата создания. И вывести на печать записи объем которых меньше 2Кб. Вот мои...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru