2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 00:54 


08/10/09
6
Спасиба , поставил проверку , он с цикла на первом же кругу выходит (может что не правильно).
Код:
#include <stdio.h>

int main()
{
   float mass[100];
   int i=0;
   FILE *f;

   f=fopen("my.txt","rt");
   while(!feof(f))
 
   {
    if( fscanf(f, "%f", &mass[i]) != 1)
   {
   break;
    }

   else

   fscanf(f,"%f", &mass[i]);
      i++;
   }
   printf("%f", mass[0]);
   fclose(f);
   return 0;
}

а где этот блокнот должен лежать не подскажите ? он его попросту не читает ...
плз подскажите - завтра прогу надо сдать , а в ней ошибка с этим блокнотом :( ни разу просто ниче не считывал раньше , а тут в задании написано - не отвертишься :(

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 00:59 
Заслуженный участник


04/05/09
4587
Я подозреваю, вы что-то перепутали.
Блокнот (notepad) в виндах - программа для редактирования текстовых файлов (с расширением .txt).
Ваша программа открывает файл my.txt и читает данные из него.
Блокнотом надо набрать содержимое файла my.txt

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 01:06 
Заслуженный участник


09/08/09
3438
С.Петербург
PAV в сообщении #195182 писал(а):
С двумя точками посложнее, так как они стоят в середине одного числа. Можно попробовать считать во вспомогательный буфер строку и предварительно ее обработать, заменив, например, две точки на одну, и затем из нее считывать числа.

В большинстве случаев программа не должна пытаться понять, что пользователь имел в виду, когда вводил неправильные данные - ее дело выдать сообщение об ошибочном вводе. А то она такого может наугадывать ... :) Обычно если нужен контроль вводимых чисел, данные сначала читаются в строку (по формату %s), а затем делается попытка преобразовать их из строки в double. Если получилось - хорошо, нет - выдаем сообщение о неправильном формате числа во входном файле.

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 01:07 


08/10/09
6
фаил называется my.txt , лежит в С:/my.txt и содержит : 4 1 1 5 4 12 43 2 2 . Но присвоить "4" первому элементу массива упорно отказывается да читать вроде бы тоже ... :(

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 01:14 
Заслуженный участник


04/05/09
4587
А вы проверили, что файл открылся?
Он, может, в другой директории находится.
Попробуйте в программе полный путь к C:/my.txt вписать.

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 03:28 
Заслуженный участник


26/07/09
1559
Алматы
2Ners
Фрагмент else fscanf(f,"%f", &mass[i]) не нужен.

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение17.10.2009, 01:02 


30/09/09
9
С файла считывается вот так:
Код:
#include "fctream"
using namespace std;
void main()
{
  ................
  char cv;

  istream infile("my.txt");
  while(iinfile)
  {
      infile>>cv;  //ничего не значащая перменная, создана только для условия окончания ввода
      ++n; //счётчик
  }

  .......... //тут закажи память под массив

  istream infile1("my.txt");

  for(.......)
      infile1>>............. //тут укажи массив

}

fctream - стандартная библиотека для работы с файлами.
istream - оператор для задания имени вводимого потока для ввода с указанного файла.
infile, infile1 - имена потоков.
Стоит отметить, что вот так "my.txt" имена файлов указываются только в том случае, если они находятся в папке написанной программы. Если они находятся в другом месте, следует написать полный путь.

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

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение17.10.2009, 06:27 
Заслуженный участник


04/05/09
4587
Gendolf в сообщении #252361 писал(а):
fctream - стандартная библиотека для работы с файлами.
Это в каком стандарте?

Gendolf в сообщении #252361 писал(а):
istream - оператор для задания имени вводимого потока для ввода с указанного файла.
istream - не оператор.

Gendolf в сообщении #252361 писал(а):
infile, infile1 - имена потоков.
infile, infile1 - имена переменных.
К тому же их объявление не скомпилируется.

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение17.10.2009, 20:13 


30/09/09
9
Виноват, в коде не istream, а ifstream, и не fctream, а fstream. Имена вполне скомпилируются, притом что это как раз имена потоков! А fstream - стандартная библиотека в С++. Не верите, скомпильте код.

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение17.10.2009, 23:30 
Заслуженный участник


04/05/09
4587
Да верю я, что если все ошибки исправить, то скомпилируется. :)

 Профиль  
                  
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение20.10.2009, 19:02 


23/12/08
245
Украина
Ксть сишная функция которая может сильно упростит жизнь называется strtod.
Если вас не пугают указатели то вам сюда:
Цитата:
Содержание | Глава 18
--------------------------------------------------------------------------------

Функция strtod
#include <stdlib.h>
double strtod(const char *start, char **end);

Функция strtod() преобразует строковое представление числа, которое содержится в строке, адресуемой параметром start, в значение типа double и возвращает полученный результат.

В версии С99 к параметрам start и end применен квалификатор restrict.

Функция strtod() работает следующим образом:

Сначала в строке, адресуемой параметром start, пропускаются пробелы, символы табуляции и пустой строки. Затем считываются символы, составляющие число. Когда считывается символ, который не может встречаться в записи числа с плавающей точкой, считывание прекращается. К таким символам относятся пробелы, символы табуляции и пустой строки, знаки препинания (но не точки) и символы, отличные от букв "Е" и "е". Наконец, параметр-указатель end устанавливается так, чтобы указывать на "неиспользованный" остаток исходной строки, если таковой существует. Это означает, что, если функция strtod() вызывается с аргументом

"100.00 плоскогубцев"
то она возвратит значение

100.00
а параметр-указатель end будет указывать на пробел, предшествующий слову

"плоскогубцев"
При возникновении переполнения функция strtod() возвращает либо значение HUGE_VAL, либо значение -HUGE_VAL (означающее положительное или отрицательное переполнение соответственно), а глобальная переменная errno устанавливается равной значению ERANGE, свидетельствующему об ошибке из-за выхода результата за пределы представимых чисел. При потере значимости возвращается нуль, а глобальная переменная errno устанавливается равной значению ERANGE. Если параметр start не указывает на число, никакого преобразования не выполняется и функция возвращает нуль.

Пример
Следующая программа читает числа с плавающей точкой из массива символов.
Код:
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>

int main(void)
{
  char *end, *start = "100.00 плоскогубцев 200.00 молотков";

  end = start;
  while(*start) {
    printf("%f, ", strtod(start, &end));
    printf("Остаток: %s\n" ,end);
    start = end;
    /* пропускает символы не входящие в числа */
    while(!isdigit(*start) && *start) start++;
  }

  return 0;
}

Вот что выводит эта программа:

100.000000, Остаток: плоскогубцев 200.00 молотков
200.000000, Остаток: молотков
Зависимые функции
atof() strtold() strtof()
--------------------------------------------------------------------------------
Содержание | Глава 18

P.S. это же фактично решение вашей задачи

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group