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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2013, 15:42   #1
Prog C++
 
Аватар для Prog C++
 
Регистрация: 25.05.2013
Сообщений: 4
Печаль Проблема с чтением чисел из файла fstream

Доброго времени суток. Столкнулся со следующей проблемкой:
Есть у меня файл , в котором через пробел записаны вещественные числа.
Нужно узнать, сколько их в файле и записать их все в массив double.
Подсчитал я их следующим способом:
Код:
fin.open("c:\\input.txt");
size_t n = 1;
double* arr;
while(!fin.eof())
{
	char c;
	fin.get(c);
	if(c == ' ') n++;
}
Когда записываю из файла в массив сразу после этого
Код:
arr = new double[n];
for (i = 0; i < n; i++)
{
      fin >> arr[i];				
}
fin.close();
то в arr ничего не записывается. Когда вывожу на экран arr, то получаются те числа, которые рандом присваивает элементам массива после инициализации.
Если убрать кусок с подсчётом кол-ва чисел и поставить n равное , например 2, то записывается нормально 2 числа из файла.
Помогите пожалуйста разобраться, где тут ошибка. Заранее благодарен за ответы.
***
Полный код:
Код:
#include <windows.h>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
        ifstream fin;
        fin.open("c:\\input.txt");

        size_t n = 1, i;
        double* arr;

        while(!fin.eof())
        {
	      char c;
	      fin.get(c);
	      if(c == ' ') n++;
        }

        arr = new double[n];

        for (i = 0; i < n; i++)
        {
        fin >> arr[i];				
        }

        fin.close();

        for (i = 0; i < n; i++)
        cout << *(arr+i) << " ";

        cout << endl;
        delete [] arr;
        system("pause");
        return 0;
}
Учиться. Учиться. Учиться.

Последний раз редактировалось Prog C++; 25.05.2013 в 15:45.
Prog C++ вне форума Ответить с цитированием
Старый 25.05.2013, 16:39   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Когда записываю из файла в массив сразу после этого
(...)
то в arr ничего не записывается.
Разумеется. Потому что Вы дошли до конца потока, курсор за последним символом файла.
Используйте ifstream::seekg().
Abstraction вне форума Ответить с цитированием
Старый 25.05.2013, 16:46   #3
Prog C++
 
Аватар для Prog C++
 
Регистрация: 25.05.2013
Сообщений: 4
По умолчанию

Добавил строку fin.seekg(0, fin.beg); перед считыванием в массив. Результат не изменился. Что я опять не так делаю?
Учиться. Учиться. Учиться.
Prog C++ вне форума Ответить с цитированием
Старый 25.05.2013, 17:20   #4
Prog C++
 
Аватар для Prog C++
 
Регистрация: 25.05.2013
Сообщений: 4
По умолчанию

Уффф... Решил трабл. Надо было сместить курсор в конец файла fin.seekg(0, fin.end);
и уже после этого смещать в начало.
***
Abstraction, спс
Учиться. Учиться. Учиться.
Prog C++ вне форума Ответить с цитированием
Старый 26.05.2013, 15:09   #5
Nedward
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 85
Смех

Всегда считал, что если приходится двигать курсор по файлу - что-то идет не так. Зачем читать файл два раза подряд? Так же проще:
Код:
#include <iostream>
#include <windows.h>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
        //Определяем переменные:
        vector <double> arr; //массив чисел
        double tmp;          //временное хранилище для double

        //Открываем и читаем файл:
        ifstream fin;
        fin.open("c:\\input.txt");
        while (!fin.eof())
        {
            fin >> tmp;
            arr.push_back(tmp);
        }
        fin.close();

        //Выводим результат чтения:
        cout << "Num of elements: " << arr.size() << endl;

        for(int i = 0; i < arr.size(); i++)
        {
            cout << "arr[" << i << "] = " << arr[i] << "; ";
        }

        cout << endl;
        arr.clear(); //очищаем массив, если больше не нужен.
        system("pause");
        return 0;
}
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. (c) Martin Golding
Nedward вне форума Ответить с цитированием
Старый 14.12.2013, 06:37   #6
Shahzod
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 21
По умолчанию

Код:
char s[20];
cout << "imja fajla:\t";
gets(s);
OemToChar(s, s);
ifstream xon;
xon.open(s, ios::binary);
if(xon.is_open()){
    int hisob, n = 0;
    float adad, *mass;
    while(!xon.eof()){
        xon >> adad;
        n++;
    }
    xon.close();
    ifstream xon;
    xon.open(s, ios::binary);
    mass = new float [n + 1];
    hisob = 1;
    while(!xon.eof())
        xon >> mass[hisob++];
    xon.close();
    hisob = 1;
    while(hisob <= n)
        cout << mass[hisob++] << endl;
}
else
    cout << "False";
Can I be a happy, if my program every time shows me: YOU ARE HAPPY!!!???
Shahzod вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с чтением файла. the27mart Общие вопросы C/C++ 4 18.11.2012 22:36
проблема с чтением из файла salwator Помощь студентам 1 23.12.2010 12:11
Проблема с чтением из файла slamm PHP 12 16.01.2010 16:40
Проблема с чтением из INI файла JustKurt Общие вопросы Delphi 3 04.08.2009 20:47
проблема с чтением из файла Tesmont Общие вопросы C/C++ 0 20.05.2009 19:39