Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Ввод целочисленного массива из файла


Автор: Faust666 28.3.2008, 14:44
Задан вектор A , максимальный размер 100 элементов. Элементами вектора являются целые числа. 

Файл имеет следующую структуру:
•    N – число элементов в векторе А;
•    строка или строки, содержащие значения элементов вектора А;

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

Автор: Mephisto 28.3.2008, 18:07
Код

#include <fstream>
#include <iostream>

using namespace std;

int main(int, char**){
  ifstream str("test.txt");
  if(!str.bad()){
    int LineNumber;
    str >> LineNumber;
    cout << LineNumber << endl;
    string tempStr;
    for(int i=1;i<=LineNumber;++i){
      str >> tempStr;
      cout << tempStr << endl;
    }
  }
  return 0;
}


Файл:
Код

3
one
two
tree

Автор: Faust666 29.3.2008, 00:16
Хм, а где в вашем примере массив целых чисел, в который надо производить ввод?
И почему в файле вместо цифр слова?

Автор: archimed7592 29.3.2008, 02:32
Faust666, то был пример как читать из файла.

Вот тебе пример аж с двумя реализациями(писал здесь, могут быть ошибки)
Код

#include <vector>
#include <istream>
#include <ostream>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>

typedef std::vector< int > Vector; // тайпдефим вектор

void advancedReader(Vector &vec) // вектор передаётся по ссылке, причём, неконстантной дабы можно было его "изменять"(добавлять в него элементы)
{
    std::ifstream ifs("file.txt");
    { // этот код пропускает первое число
        int tmp;
        ifs >> tmp; // считываем N
    }
    std::istream_iterator< int > isi(ifs), end; // создаём два итератора. первый - читает из ifs, второй - псевдоитератор означающий конец ввода
    std::copy(isi, end, std::back_inserter(vec)); // "копируем" последовательность от isi до end в вектор. back_inserter - это тоже псевдоитератор, который осущевствляет вставку в вектор методом push_back
}

void simpleReader(Vector &vec)
{
    std::ifstream ifs("file.txt");
    int N;
    ifs >> N; // считываем N
    for (int i = 0; i < N; ++i)
    {
        int element;
        ifs >> element; // читаем очередное число
        vec.push_back(element); // добавляем его в конец вектора
    }
}

// в качестве бонуса: вывод вектора на экран
void printVector(const Vector &vec)
{
    std::ostream_iterator< int > osi(std::cout, " ");
    std::copy(vec.begin(), vec.end(), osi);
    std::cout << std::endl;
}

int main()
{
    {
        Vector vec;
        advancedReader(vec);
        printVector(vec);
    }
    
    {
        Vector vec;
        simpleReader(vec);
        printVector(vec);
    }

    return 0;
}

Автор: inside_pointer 29.3.2008, 10:49
Придумай чо-нибудь как правильно массив создать(там есть какие-то операции типа выделить память и всё такое), этот код работает.

Код

#include <stdio.h>

int main()

{
    int i, len;
    FILE * in;
    in = fopen("a.in", "r");
    
    fscanf(in, "%d", &len);
    int arr[len];
    
    for (i = 0; i < len; ++i)
        fscanf(in, "%d", &arr[i]);
    
    for (i = 0; i < len; ++i)
        printf("%d ", arr[i]);
        
    putchar('\n');    
    
    fclose(in);
    return 0;
}

//


Код

3
100
200
300

Автор: bsa 30.3.2008, 12:27
inside_pointer, вот только это не С++  smile 

Автор: inside_pointer 30.3.2008, 14:28
А он основ не знает, не может массив найти, а основы С++ в С  smile 

Код

string tempStr;

Автор: Mephisto 31.3.2008, 09:03
Цитата(inside_pointer @  30.3.2008,  15:28 Найти цитируемый пост)
А он основ не знает, не может массив найти

Вообще-то из условий задан вектор А. 
Теперь и я не могу массив найти.  smile 

Автор: Graf_h 31.3.2008, 09:45
Цитата(Faust666 @ 28.3.2008,  14:44)
Задан вектор A , максимальный размер 100 элементов. Элементами вектора являются целые числа. 

Файл имеет следующую структуру:
•    N – число элементов в векторе А;
•    строка или строки, содержащие значения элементов вектора А;

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

Код

...
int myint;

vector<int> vec

 ifstream str("test.txt");
  
   if(!str.fail()){
            while (str>>myint){// пока получаем данные из файла
                       vec.push_back(myint);//записываем данные у вектор
            }
}




и не нужно цыкла for(...);

Автор: inside_pointer 31.3.2008, 12:54
Одномерный массив - это не вектор чтоли ?

Цитата

Элементами вектора являются целые числа.


Автор: archimed7592 31.3.2008, 13:34
Цитата(inside_pointer @  31.3.2008,  12:54 Найти цитируемый пост)
Одномерный массив - это не вектор чтоли ?

Нет, конечно smile.

Кстати, если я не ошибаюсь, твой код violates ISO-C++(да, я знаю, что он соответствует C99, но не считаю, что целесообразно учить человека, желающего изучить С++ тем вещам, которые не будут там работать)...

Автор: Mephisto 31.3.2008, 15:32
Graf_h, первым числом в файле идет количество элементов в файле!
Его не нужно пихать в сам вектор.
А числа которые идут после определенного числа из задания совершенно непонятно что с ними делать! Зачем их в вектор-то пихать?

Т.е. если файл:
Цитата

3
123
124
125
126
127

В векторе должно быть
Цитата

123
124
125

В задании не сказано что в вектор должны попасть 124 и 125! А тем более 3

Автор: Graf_h 31.3.2008, 15:49
Цитата(Faust666 @  28.3.2008,  14:44 Найти цитируемый пост)
Файл имеет следующую структуру:•    N – число элементов в векторе А;•    строка или строки, содержащие значения элементов вектора А;


Цитата(Mephisto @  31.3.2008,  15:32 Найти цитируемый пост)
Graf_h, первым числом в файле идет количество элементов в файле!Его не нужно пихать в сам вектор.

Зачем его вообще задавать? В моем варианте алгоритм пластичнее , так как не нужно указывать числа елементов. ы даже когда в файле будет не целочисельное число, алгоритм не даст сбой, а просто перестанет считывать данные. можно конечно еще ловить исключения... но это уже другая история smile 


Mephisto, я его не навязываю, просто показал как можно делать, а то все For да  For  smile 

Автор: Mephisto 31.3.2008, 16:05
Graf_h, вот структура файла:
Цитата

Файл имеет следующую структуру:
•    N – число элементов в векторе А;
•    строка или строки, содержащие значения элементов вектора А;

Твой вариант, каким бы пластичным он небыл, но не решает поставленной задачи  smile 

Автор: Graf_h 31.3.2008, 16:21
Цитата(Mephisto @  31.3.2008,  16:05 Найти цитируемый пост)
Твой вариант, каким бы пластичным он небыл, но не решает поставленной задачи


Код

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>

int main(int argc, char* argv[])
{
    std::ifstream str("test.txt");
    int count;//количество елементов
    int elem;//для считывания елемента
    std::vector<int> vec;//вектор для хранения данных
    if (!str.fail()){
     
        str>>count;//читаем количество елементов
     int index=0;
     while (!str.eof()&& index<count){
         if (str>>elem){//если елемент типа int то записываем в вектор
             std::cout<<elem<<std::endl;
            vec.push_back(elem);
            index++;
         }

     
     }

    } else std::cerr<<"error open file"<<std::endl;
    

    
    return 0;
}






Mephisto, cмотрите какая красота + проверяет елемент на соответствее типа int. вот вам пластика  smile 

P.S програмирование это исскуство

Автор: inside_pointer 1.4.2008, 11:25
Цитата(archimed7592)

но не считаю, что целесообразно учить человека, желающего изучить С++ тем вещам, которые не будут там работать

Я думаю надо учить его определять где массивы, а не с векторов начинать, а что у меня в коде не будет работать ?
Я только память не стал выделять.

Автор: Mephisto 1.4.2008, 11:40
Цитата(inside_pointer @  1.4.2008,  12:25 Найти цитируемый пост)
Я думаю надо учить его определять где массивы, а не с векторов начинать

Хорошо что ты так думаешь, но для начала в задании четко сказано что нужен именно вектор! smile
А на счет массивов вопрос спорный. Я уже и не припомню когда приходилось использовать массивы в чистой форме. Как по мне редкая задача. Оператор [] частенько юзаю, массивы в чистом виде - нет. Хватает векторов, списков, хеш таблиц... 

Автор: inside_pointer 1.4.2008, 16:10
Цитата(Mephisto)

Хорошо что ты так думаешь, но для начала в задании четко сказано что нужен именно вектор!

Так я знаю что вектор это и есть массив, как бы archimed7592 меня не переубеждал.

Цитата(Mephisto)

А на счет массивов вопрос спорный. Я уже и не припомню когда приходилось использовать массивы в чистой форме.

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

Какой смысл ему объективно программировать, если он только начинает, или что прямо есть такой смысл, ничего не понимая писать сложные коды ? тогда как он их будет писать, через копи/пейст ?

А ты его спроси он понял хоть одну строчку, или это то же самое что он нашёл до ?

Автор: Mephisto 1.4.2008, 16:45
Цитата(inside_pointer @  1.4.2008,  17:10 Найти цитируемый пост)
тем более человеку после Паскаля понимать векторы эти

Я пишу собственно сам на дельфине, ничего, массивы тоже не использую. smile Хоть и сложнее там со списками чем в сях, больше кода писать приходится. 
Цитата(inside_pointer @  1.4.2008,  17:10 Найти цитируемый пост)
Какой смысл ему объективно программировать

Объективно хорошо сказано... Задача так стоит, реализовать на СиПиПи вектор с числами, конечно можно человеку тетрис предложить что круче естественно.
Цитата(inside_pointer @  1.4.2008,  17:10 Найти цитируемый пост)
тогда как он их будет писать, через копи/пейст ?

Знаешь, если не вникать в суть, то копипастить и массивы можно неплохо.  smile 
Цитата(inside_pointer @  1.4.2008,  17:10 Найти цитируемый пост)
А ты его спроси он понял хоть одну строчку, или это то же самое что он нашёл до ? 

Это есть решение поставленной задачи, если человек не понял, то пусть задает вопрос что именно не понятно. Можно попробовать и обьяснить.

Да, кстати, а где топикстартер? 

Автор: archimed7592 1.4.2008, 21:04
Цитата(inside_pointer @  1.4.2008,  11:25 Найти цитируемый пост)
Я только память не стал выделять.

Ага. Это фича C99, которой в legacy C++ пока нет.

Цитата(inside_pointer @  1.4.2008,  16:10 Найти цитируемый пост)
Так я знаю что вектор это и есть массив, как бы archimed7592 меня не переубеждал.

Я не собираюсь никого переубеждать против их воли: хочется жить в своём узком мирке и категорично отказываться от расширения кругозора - на здоровье.

Цитата(inside_pointer @  1.4.2008,  16:10 Найти цитируемый пост)
Какой смысл ему объективно программировать, если он только начинает, или что прямо есть такой смысл, ничего не понимая писать сложные коды ? тогда как он их будет писать, через копи/пейст ?

А ты его спроси он понял хоть одну строчку, или это то же самое что он нашёл до ? 

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

В общем разговор ни о чём("а он хотел так", "а ему нужно вместо этого нужно вот это", "а ...").

Автор: inside_pointer 2.4.2008, 04:49
Цитата(archimed7592)

Я не собираюсь никого переубеждать против их воли: хочется жить в своём узком мирке и категорично отказываться от расширения кругозора - на здоровье.

Тогда давай ему ассемблер, он как раз научится и будет векторы понимать в самой их сути, я за то чтобы если человек не знает где массив показать ему где массив.
А по твоему получается что если он в твоём коде не разберётся, то у него скромные умственные способности, нормально да?

Цитата(archimed7592)

Ага. Это фича C99, которой в legacy C++ пока нет.

Я имел ввиду функцию malloc(), а не new и delete

Цитата(Mephisto)

Знаешь, если не вникать в суть, то копипастить и массивы можно неплохо. 

Но при этом понимать их легко, потому что у него уже есть опыт работы с ними.

Цитата(Mephisto)

Я пишу собственно сам на дельфине, ничего, массивы тоже не использую.

Я за массивы, они надёжные, всегда знаешь сколько памяти он жрёт и всё такое.

Автор: archimed7592 2.4.2008, 07:00
Цитата(inside_pointer @  2.4.2008,  04:49 Найти цитируемый пост)
Я имел ввиду функцию malloc(), а не new и delete

Кто о чём, а... Короче забей.

Автор: bsa 2.4.2008, 16:39
Цитата(inside_pointer @ 2.4.2008,  04:49)
Цитата(Mephisto)

Я пишу собственно сам на дельфине, ничего, массивы тоже не использую.

Я за массивы, они надёжные, всегда знаешь сколько памяти он жрёт и всё такое.

Рекомендую почитать книжки по С++. В частности, Мейерса и Александреску 101 совет.
std::vector - это и есть массив. Собственно, сам вектор содержит три указателя: начало данных, конец данных, конец резерва данных. Это единственная плата за его использование (не считая, что для ускорения работы память выделяется экспоненциально, но резервом можно управлять). Если ты считаешь, что она чрезмерна, то читай еще один совет из той же книги - про преждевременную оптимизацию.
кстати, получить доступ к массиву элементов можно так:
Код
std::vector<int> arr;
...
int *p = &arr.front();

Автор: inside_pointer 4.4.2008, 01:52
Цитата(bsa)

В частности, Мейерса и Александреску 101 совет.
std::vector - это и есть массив.

Что и требовалось доказать  smile 

Цитата(bsa)

Это единственная плата за его использование

Не, для паскалиста, нужно будет ещё книжку купить, потом потратить время на неё, изучая синтаксис, вместо того чтобы сразу записать всё на массивах, а когда нужны указатели на начало и конец, изучить указатели ещё.

Автор: Mephisto 4.4.2008, 14:52
Цитата(inside_pointer @  4.4.2008,  02:52 Найти цитируемый пост)
Не, для паскалиста, нужно будет ещё книжку купить, потом потратить время на неё, изучая синтаксис

А есть вариант при котором это можно избежать? smile 

Автор: inside_pointer 4.4.2008, 15:18
А он знает массивы уже, вот тебе и вариант, что зная их там он знает их уже здесь.
А чтобы понять запись вектора знаешь сколько времени ему нужно будет на это потратить, а операции с непонятным вектором, а отладка малопонятных операций с непонятным вектором.

Автор: Mephisto 5.4.2008, 13:07
Цитата(inside_pointer @  4.4.2008,  16:18 Найти цитируемый пост)
А он знает массивы уже

Кто знает? 
Цитата(inside_pointer @  4.4.2008,  16:18 Найти цитируемый пост)
А чтобы понять запись вектора знаешь сколько времени ему нужно будет на это потратить, а операции с непонятным вектором, а отладка малопонятных операций с непонятным вектором. 

Если ты не понимаешь векторы, это не означает что весь мир их не понимает. Посмотрел один раз реализацию и стало понятно как они реализованы. Что тут сложного-то. 

Автор: bsa 6.4.2008, 16:15
Цитата(inside_pointer @ 4.4.2008,  15:18)
А он знает массивы уже, вот тебе и вариант, что зная их там он знает их уже здесь.
А чтобы понять запись вектора знаешь сколько времени ему нужно будет на это потратить, а операции с непонятным вектором, а отладка малопонятных операций с непонятным вектором.

Опять же, читаем книжки, например С. Мейерс "Эффективное использование STL". Там все написано.
Вектор реализуется в виде обычных массивов, доступ к элементам которого очуществляется через указатели. В итоге, скорость работы с ним не ниже, чем с сишными массивами (если, конечно, не включен режим отладки библиотеки STL), а удобство программирования и безопасность итогового кода гораздо выше.

Автор: J0ker 2.10.2008, 07:06
ну inside_pointer в некоторм смысле прав - непонимание многих вещей в C++ коренится в незнании "как это устроено" на низком уровне. Тупой кодинг (да-да, можете начинать еня пинать прямо здесь) еще прокатит в VB, но C++ слишком близок к железу, что-бы его (железо) игнорировать. Зная основы (которые как правильно было замеано лежат в plain C, и еще глубже - в ассемблере) можно тупую зубрежку непонятных правил заменить глубоким пониманием откуда сии правила проистекают - что в разы сокращает сроки обучения - лучше день потерять, а потом за пять минут долететь.

ЗЫЖ сорри за некрофильство - не обратил внимания на дату  smile 

Автор: inside_pointer 3.10.2008, 07:09
да задание по ходу про вектор было, но прощаться с базовыми понятиями тоже нельзя
cpp не идеальный, сейчас там вектор одно завтра другое послезавтра третье
кому что короче

Автор: bsa 6.10.2008, 00:00
Цитата(inside_pointer @ 3.10.2008,  07:09)
сейчас там вектор одно завтра другое послезавтра третье
кому что короче

Если пользоваться открытыми интерфейсами, то проблем быть не должно. Есть определенные гарантии поведения вектора.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)