2014 dxdy logo

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

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




На страницу Пред.  1, 2
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 00:54 
Спасиба , поставил проверку , он с цикла на первом же кругу выходит (может что не правильно).
Код:
#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 
Я подозреваю, вы что-то перепутали.
Блокнот (notepad) в виндах - программа для редактирования текстовых файлов (с расширением .txt).
Ваша программа открывает файл my.txt и читает данные из него.
Блокнотом надо набрать содержимое файла my.txt

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 01:06 
PAV в сообщении #195182 писал(а):
С двумя точками посложнее, так как они стоят в середине одного числа. Можно попробовать считать во вспомогательный буфер строку и предварительно ее обработать, заменив, например, две точки на одну, и затем из нее считывать числа.

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

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 01:07 
фаил называется my.txt , лежит в С:/my.txt и содержит : 4 1 1 5 4 12 43 2 2 . Но присвоить "4" первому элементу массива упорно отказывается да читать вроде бы тоже ... :(

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 01:14 
А вы проверили, что файл открылся?
Он, может, в другой директории находится.
Попробуйте в программе полный путь к C:/my.txt вписать.

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение09.10.2009, 03:28 
2Ners
Фрагмент else fscanf(f,"%f", &mass[i]) не нужен.

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение17.10.2009, 01:02 
С файла считывается вот так:
Код:
#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 
Gendolf в сообщении #252361 писал(а):
fctream - стандартная библиотека для работы с файлами.
Это в каком стандарте?

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

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

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение17.10.2009, 20:13 
Виноват, в коде не istream, а ifstream, и не fctream, а fstream. Имена вполне скомпилируются, притом что это как раз имена потоков! А fstream - стандартная библиотека в С++. Не верите, скомпильте код.

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

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение20.10.2009, 19:02 
Ксть сишная функция которая может сильно упростит жизнь называется 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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group