2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение11.03.2009, 17:52 
В строках текстового файла записаны десятичные числа (не целые – т.е. может быть точка), разделённые пробелами и (или) символами перевода строки.
вроде бы знаю основные функции для работы с файлами,но что то не могу реализовать.вот пытался написать, но дальше ступор. направьте на путь истинный.плиз
Код:
#include <stdio.h>
float main()
{
FILE *f;
float sum,x;
sum=0;
f=fopen("ex.txt","r");
while (!feof(f))
{
fscanf(f,"%4.2f",x);
sum+=x;
}
fclose(f)
return 0;
}
[/code]

 
 
 
 
Сообщение11.03.2009, 20:11 
Аватара пользователя
Вы проверяли в отладчике, что именно не работает?

Сразу бросаются в глаза следующие вещи. Так как файл текстовый, то второй аргумент функции fopen должен быть "rt" (может быть, это и неважно, но так лучше). В функции fscanf лучше не указывать точный формат представляемых чисел, а просто задать спецификатор %f. Необходимо обязательно проверять возвращаемое значение функции fscanf, оно должно быть равно 1. Дело в том, что если функция не считала значение по какой-либо причине, то переменная x будет содержать либо предыдущее значение, либо мусор, так что sum в любом случае станет неправильной.

Я рекомендую вообще не пользоваться проверкой eof, а ограничиться только проверкой возвращаемого значения fscanf, если оно не равно 1 - то прерывать цикл.

 
 
 
 
Сообщение11.03.2009, 22:50 
На самом деле, самая серьезная (хотя несерьезных ошибок не бывает) проблема кода Moko - отсутствие символа амперсенда перед переменной 'x' в функции fscanf...

 
 
 
 
Сообщение11.03.2009, 23:07 
Аватара пользователя
Да, и правда. А я даже не заметил. :oops:

 
 
 
 
Сообщение11.03.2009, 23:44 
Жуткий оффтопик, но...

А вот я например не знаю синтаксиса функции scanf() :). Вообще-то, за 7+ лет проффесионального программирования не пригодилась ни разу :). Правда, и область довольно специфична - embedded C/C++, но все-таки... Ни разу не возникло желания ее использовать. Примерные возможности функции знаю, тестировал.

Хотелось бы понять - что, действительно столь полезная функция в реальных программных проектах? Вообще-то, ИМХО, если парсинг - то по-серьезному. Если побаловаться, то... все равно есть более простые решения, чем scanf(). В чем моя ошибка? (в ДНК не предлагать! :).

 
 
 
 
Сообщение12.03.2009, 09:54 
Аватара пользователя
Я пользуюсь этой функцией часто. Ну вот, скажем, пример: есть большой набор объектов и для каждого, скажем, по три целочисленные характеристики. Все это выведено в текстовый файл, на каждой строчке - имя объекта и перечислены характеристики. Как это загрузить в программу для обработки? Самому писать парсер? Зачем, когда со scanf это одна строчка
Код:
scanf("%s %d %d %d",...)

 
 
 
 
Сообщение14.03.2009, 18:45 
вот учел все ваши советы, изменил , все компилится но не считает сумму чисел, а выводит левое число :(что не так, подскажите плиз
Код:
#include <stdio.h>

int main()
{
   float sum,x;
   FILE *f;
   
   f=fopen("ex.txt","rt");
           sum=0;
   while(!feof(f))
   {
   fscanf(f,"%f",&x);
      sum+=x;
   }
   printf("Sum = %f",&sum);
   fclose(f);
   return 0;
}

p.s. PAV:Я рекомендую вообще не пользоваться проверкой eof, а ограничиться только проверкой возвращаемого значения fscanf, если оно не равно 1 - то прерывать цикл.
я не понял как это проверять. может покажешь?

 
 
 
 
Сообщение14.03.2009, 18:46 
Аватара пользователя
А вот как раз в printf амперсанд не нужен.

 
 
 
 
Сообщение14.03.2009, 19:02 
да теперь считает.

Добавлено спустя 4 минуты 15 секунд:

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

 
 
 
 
Сообщение15.03.2009, 11:43 
Аватара пользователя
Moko в сообщении #195004 писал(а):
я не понял как это проверять. может покажешь?


Что-то вроде такого
Код:
while(1)
{
    if( fscanf(fl, "%f", &x) != 1)
        break;
    sum += x;
}


или еще короче

Код:
while( fscanf(fl, "%f", &x) == 1)
    sum += x;


Добавлено спустя 7 минут 13 секунд:

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


Это уже сложнее. Вы должны описать, какие отклонения от нормального содержания файла допускаются, и вручную их обработать.

Если хотите пропускать лишние символы, то можно сделать что-то вроде такого: если fscanf не сумела считать число, а файл еще не кончился, то можно считать один символ и пробовать читать дальше.

С двумя точками посложнее, так как они стоят в середине одного числа. Можно попробовать считать во вспомогательный буфер строку и предварительно ее обработать, заменив, например, две точки на одну, и затем из нее считывать числа. Но в любом случае нужно продумать, что Вы хотите видеть, например, если файл будет содержать текст "1.2.3" и много других похожих примеров. Короче, нужна модель ошибок во входных данных, которые программа должна исправлять.

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение08.10.2009, 23:45 
Люди добрые а подскажите пожалуйста !!!
Надо считать числа с блокнота в одномерный массив
Вообщем все тоже самое , но работать не хочет ... :(


Код:
#include <stdio.h>

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

   f=fopen("my.txt","rt");
   while(!feof(f))
   {
   fscanf(f,"%f", &mass[i]);
      i++;
   }
   printf("%f", mass[0]);
   fclose(f);
   return 0;
}

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение08.10.2009, 23:50 
Что значит "работать не хочет"?
Запускаете, а она говорит "Не хочу работать!"?

Если угадывать, то, во-первых, нет проверки на то, что число значений больше, чем размер массива.
А во-вторых, нет проверки, что число прочитано. Например, если в файле что-то, что не походит на число, то fscanf() ничего не прочитает, вернёт ошибку, и цикл будет продолжатся до бесконечности.

 
 
 
 Re: C++.Посчитать сумму вещественных чисел из txt-файла
Сообщение08.10.2009, 23:58 
запускается и вешатся в цикле, в дебаге значение mass[0] из муссора меняется на 0.0 и все на этом заканчивается , ну и mass[1] тоже самое.
PS : ну 1-ое эт понятно , но там меньше 100 чисел - он же сами числа с блокнота читает ?
А как второе делается?

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

fscanf() возвращает число прочитанных полей, в вашем случае должно быть 1. Если не 1, то при чтении произошла ошибка.

 
 
 
 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;
}

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

 
 
 [ Сообщений: 26 ]  На страницу 1, 2  След.


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