2014 dxdy logo

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

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




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


09/09/08
30
Россия
В строках текстового файла записаны десятичные числа (не целые – т.е. может быть точка), разделённые пробелами и (или) символами перевода строки.
вроде бы знаю основные функции для работы с файлами,но что то не могу реализовать.вот пытался написать, но дальше ступор. направьте на путь истинный.плиз
Код:
#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 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Вы проверяли в отладчике, что именно не работает?

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

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

 Профиль  
                  
 
 
Сообщение11.03.2009, 22:50 


27/11/05
183
Северодонецк
На самом деле, самая серьезная (хотя несерьезных ошибок не бывает) проблема кода Moko - отсутствие символа амперсенда перед переменной 'x' в функции fscanf...

 Профиль  
                  
 
 
Сообщение11.03.2009, 23:07 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Да, и правда. А я даже не заметил. :oops:

 Профиль  
                  
 
 
Сообщение11.03.2009, 23:44 


21/03/06
1545
Москва
Жуткий оффтопик, но...

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

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

 Профиль  
                  
 
 
Сообщение12.03.2009, 09:54 
Супермодератор
Аватара пользователя


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

 Профиль  
                  
 
 
Сообщение14.03.2009, 18:45 


09/09/08
30
Россия
вот учел все ваши советы, изменил , все компилится но не считает сумму чисел, а выводит левое число :(что не так, подскажите плиз
Код:
#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 
Заслуженный участник
Аватара пользователя


06/10/08
6422
А вот как раз в printf амперсанд не нужен.

 Профиль  
                  
 
 
Сообщение14.03.2009, 19:02 


09/09/08
30
Россия
да теперь считает.

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

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

 Профиль  
                  
 
 
Сообщение15.03.2009, 11:43 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
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 


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))
   {
   fscanf(f,"%f", &mass[i]);
      i++;
   }
   printf("%f", mass[0]);
   fclose(f);
   return 0;
}

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


04/05/09
4587
Что значит "работать не хочет"?
Запускаете, а она говорит "Не хочу работать!"?

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

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


08/10/09
6
запускается и вешатся в цикле, в дебаге значение mass[0] из муссора меняется на 0.0 и все на этом заканчивается , ну и mass[1] тоже самое.
PS : ну 1-ое эт понятно , но там меньше 100 чисел - он же сами числа с блокнота читает ?
А как второе делается?

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


04/05/09
4587
Я не знаю с какого блокнота он читает. Проверку тем не менее поставьте.

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

 Профиль  
                  
 
 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;
}

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

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

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



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

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


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

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