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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Garred
282 / 80 / 4
Регистрация: 19.04.2011
Сообщений: 220
#1

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

14.11.2011, 23:30. Просмотров 1651. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 23:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив из файла С++ (C++):

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Если тип элемента - int, то он всегда будит весить строго sizeof(int)
0
greeezz
274 / 167 / 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то как посчитать количество элементов по размеру одного из них.
0
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);
0
greeezz
274 / 167 / 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. что не верно. т.к. у меня три числа. вот и все.

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

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

бинарный Файл с 3мя элементами типа доубл всегда будит весить 24 байта. Не важно, какие значения будут у этих элементов.
0
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
15.11.2011, 05:13 #10
Цитата Сообщение от Bers Посмотреть сообщение
бинарный Файл с 3мя элементами типа доубл всегда будит весить 24 байта
совершенно верно. потому что в нем три числа будут записаны условно говоря так: 00001011 00010001 00101001 ну только в 8 раз длиннее
Цитата Сообщение от Bers Посмотреть сообщение
В текстовом файле нет никаких доублов.
о чем и речь. товарищ Garred, в своем коде работает с текстовым файлов а не с бинарным. моя ремарка была именно по этому поводу.
0
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) имеют шапку. Которая имеет фиксированный размер, и в которой прописываются все необходимые служебные данные для быстрого чтения файла.
1
Garred
282 / 80 / 4
Регистрация: 19.04.2011
Сообщений: 220
15.11.2011, 08:07  [ТС] #12
Bers, дело в том, что в текстовом файлеe приблизительные курсы перевода доллара в рубль. То есть вида 30.24 Два знака целой части, точка, два знака дробной части. Их количество случайное, а записывать в исходный файл их можно либо в строку через пробел, либо построчно (в столбик). Если кто-то сможет переделать мой код,так как я спрашивал в первом сообщении(без количества элементов в файле) то буду очень благодарен.
0
prazuber
110 / 110 / 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;
0
15.11.2011, 11:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 11:24
Привет! Вот еще темы с ответами:

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

Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. - C++
Есть текстовый файл, в нем 3 столбца чисел (число строк заранее неизвестно). Напишите пожалуйста код, чтобы первый столбец записывался в...

Считать массив А с файла a.txt. после чего сформировать массив С в котором все отрицательные элементы с масси - C++
Помогите написать программу на C++. Изучала этот язык меньше пол года, пока есть проблемы. очень нужна ваша помощь Считать массив А с файла...

Переписать массив строк из файла в двумерный массив - C++
Переписать массив строк из файла в двумерный массив типа CHAR &quot; char Map&quot; вот что получается, как сделать чтоб копировал строку в...


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

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

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