Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2010, 15:40   #1
utrnjhyfgjktjy
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 13
По умолчанию Чтение из файла

Здравствуйте. У меня такая проблема: есть файл в котором хранятся данные:

1 2 3
2 4 5 6 7
3 8

мне нужно его считать в такую структуру vector<vector<int>> Как это сделать? везде, где я читал были даны примеры как читать информацию из файла, когда знаешь сколько чисел в строке и количество строк, а как прочитать если не знаешь ни сколько столбцов ни сколько строк в моем файле?

Последний раз редактировалось utrnjhyfgjktjy; 30.01.2010 в 15:45.
utrnjhyfgjktjy вне форума Ответить с цитированием
Старый 30.01.2010, 16:19   #2
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Считывайте в цикле "до конца файла (f)":
Цитата:
for i:= 1 to eof(f) do
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 30.01.2010, 16:28   #3
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Считывает файл для вашего случая.

Код:
#include <iostream.h>
#include <fstream.h>

int main()
{
        ifstream f("C:\\temp.txt");
        char c;
        char str[255];

        while(!f.eof())
                {
                        f.getline(str, 255);

                        for(int i = 0; i <strlen(str); i++)
                                {
                                        if((str[i] >= '1') && (str[i] <= '9'))
                                                cout << atoi(&str[i]) << " ";
                                }

                        cout << "\n";
                }

        cin.get();

        return 0;
}
Что бы перевести символ в число нужно воспользоваться функцией atoi(), atoi(&c).

Последний раз редактировалось profi; 30.01.2010 в 16:43.
profi вне форума Ответить с цитированием
Старый 30.01.2010, 16:37   #4
utrnjhyfgjktjy
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 13
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Считывает файл для вашего случая.

Код:
#include <iostream.h>
#include <fstream.h>

int main()
{
        ifstream f("C:\\temp.txt");
        char c;

        while(!f.eof())
                {
                        c = f.get();
                        if((c >= '1') && (c <= '9'))
                                cout << c << " ";
                }

        cin.get();

        return 0;
}
Я так понял ваш код считывает все даннные из файла в "1 строку" и выводит каждое из чисел, а мне имено нужно будет потом обращаться к этим числам, желательно чтобы получилась структура вида vector<vector<int>> тоесть каждая строка была вектором.

А еще подскажите пожалуйста, почему у меня ненаходит iostream.h , fstream.h. Причем случается ето довольно часто.

По поводу вашого добавления, я же не узнаю где кончится моя строка.

Последний раз редактировалось utrnjhyfgjktjy; 30.01.2010 в 16:43.
utrnjhyfgjktjy вне форума Ответить с цитированием
Старый 30.01.2010, 16:43   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
По поводу вашого добавления, я же не узнаю где кончится моя строка.
Как это? Конечно знаешь. Функция getline читает полностью строку в массив str и потом цикл его перебирает и смотрит, что к чему. Перед циклом
Код:
                        for(int i = 0; i <strlen(str); i++)
                                {
                                        if((str[i] >= '1') && (str[i] <= '9'))
                                                cout << atoi(&str[i]) << " ";
                                }
нужно сделать счетчик, для подсчета строк, т.е. какую строку сейчас считываем, а в цикле в зависимости от счетчика, записывать в тот вектор в который нужно, т.е. код
Код:
cout << atoi(&str[i]) << " ";
заменить на
Код:
 if(kol == 1) vect.push_back(atoi(&str[i]));
(Если первая строка, тогда считываем в вектор vect).

Подправил код. См. пост №3.

Последний раз редактировалось profi; 30.01.2010 в 16:55.
profi вне форума Ответить с цитированием
Старый 30.01.2010, 16:54   #6
utrnjhyfgjktjy
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 13
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Как это? Конечно знаешь. Функция getline читает полностью строку в массив str и потом цикл его перебирает и смотрит, что к чему. Перед циклом
Код:
                        for(int i = 0; i <strlen(str); i++)
                                {
                                        if((str[i] >= '1') && (str[i] <= '9'))
                                                cout << atoi(&str[i]) << " ";
                                }
нужно сделать счетчик, для подсчета, строк, т.е. какую строку сейчас считываем, а в цикле в зависимости от счетчика, записывать в тот вектор в который нужно, т.е. код
Код:
cout << atoi(&str[i]) << " ";
заменить на
Код:
vect.push_back(atoi(&str[i]));
.

Подправил код. См. пост №3.
Спасибо Вам большое.
utrnjhyfgjktjy вне форума Ответить с цитированием
Старый 30.01.2010, 17:10   #7
utrnjhyfgjktjy
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 13
По умолчанию

У меня появился еще вопрос по некоторым операторам

char str[255]; что он делает?определяет 255 символ строки?

f.getline(str, 255); ета функция получает строку из файла длиной 255?

Просто прочитал это и не разобрался:
Если нужно считать строку со всеми пробелами, то необходимо использовать функцию getline следующим образом:
string S;
getline(cin,S);


for(int i = 0; i <strlen(str); i++)
Непонятно, что strlen(str) возвращает и как этим пользуется цикл.
Описание.

Функция strlen возвращает в байтах длину строки string,
причем нулевой символ окончания (') в длину не засчитывается.

Возвращаемое значение.

Функция возвращает длину string. Возвращаемого значения в
случае возврата нет.
utrnjhyfgjktjy вне форума Ответить с цитированием
Старый 30.01.2010, 17:25   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
char str[255]
- объявления массива из 255 элементов.

Цитата:
f.getline(str, 255); эта функция получает строку из файла длиной 255?
Да.

Цитата:
Если нужно считать строку со всеми пробелами, то необходимо использовать функцию getline следующим образом:
string S;
getline(cin,S);
Это долго объяснять. Есть просто такое понятие как "поток". Можно легко пользоваться потоками т.е. переключать их от одного устройства к другому для ввода/вывода информации. В данном вашем примере рассматривается принятия потока из устройства ввода(клавиатуры), если нужно с файла, тогда так как я написал.

Цитата:
strlen(str)
Возвращает длину строки. Зачем вам класс string? Делайте так как написал я.

Последний раз редактировалось profi; 30.01.2010 в 17:30.
profi вне форума Ответить с цитированием
Старый 30.01.2010, 17:32   #9
utrnjhyfgjktjy
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 13
По умолчанию

Появилась еще 1 проблемка, если строка имеет вид
6 77
тоесть имеют место числа а не цифры, то как мне быть в этом случае?считывает неправильно вот так 6 77 7
(Попробовал поставить так
if((str[i] >= '1') && (str[i] <= '99')) не вышло)
utrnjhyfgjktjy вне форума Ответить с цитированием
Старый 30.01.2010, 17:41   #10
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
#include <iostream.h>
#include <fstream.h>

int main()
{
        ifstream f("C:\\temp.txt");
        char c, *ptr;
        char str[255];

        while(!f.eof())
                {
                        f.getline(str, 255);

                        ptr = strtok(str, " ");

                        while (ptr)
                                {
                                        if((atoi(ptr) >= 1) && (atoi(ptr) <= 99))
                                                cout << atoi(ptr) << " ";
                                        ptr = strtok(NULL, " ");
                                }

                        cout << "\n";
                }

        cin.get();

        return 0;
}
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла DimOn4Ik PHP 1 02.01.2010 22:41
чтение из файла. aschak Общие вопросы C/C++ 9 30.12.2008 15:24
Чтение из файла e@gle Общие вопросы Delphi 3 14.12.2008 17:21
Чтение из файла Amen БД в Delphi 2 09.12.2008 10:40
Чтение из файла Arkuz Общие вопросы Delphi 14 08.10.2008 19:52