Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование fscanf

49K
18 августа 2009 года
JeVeL
7 / / 07.08.2009
Доброго времени суток ,форумчане!
Я только учусь :confused:
Помогите пожалуйста разобраться :
Код:
#include <stdio.h>

int main(){
    FILE *fp;
    char name;
    long a,b;
    if((fp = fopen("file.txt","r"))==NULL)
        {
        puts("Error!");
        return -1;
        }
    while(fp!= EOF)
          fscanf(fp,"%s%d%d",&name,&a,&b);
        // а здесь застрял
   
    fclose(fp);
    system("pause");
    }

пример файла:
1002_090.TXT 200 1089049
1004_090.TXT 200 2176073
~~~~~~~~~~~~~~~~~~~~~
4859_0907.TXt 20 463547
хочу получить в выводе:
1002 200 1089049
1004 200 2176073
~~~~~~~~~~~~
4859 20 463547
сумма a =420 // суммы 2го и 3го столбца
сумма b =3728669
Можно ли применять fscanf ? Пробовал посимвольно в массив файл считать
но потом не могу выделить нужные элементы .
297
18 августа 2009 года
koodeer
1.2K / / 02.05.2009
Да, fscanf вполне можно применять в данном случае.
Код:
#include <stdio.h>

int main()
{
    FILE *fp;
    char *name = new char[200]; // не забываем выделять память под строку!
    long a,b;
    long sum_a=0;
    long sum_b=0;

    if( (fp = fopen("file.txt","r"))==NULL )
    {
        puts("Error!");
        return -1;
    }
    while( fscanf(fp,"%s%d%d",name,&a,&b) != EOF )
    {
        printf("%.4s %d %d\n",name,a,b); // .4 - выводим только 4 символа строки
        sum_a += a;
        sum_b += b;
    }
    printf("%s %d\n","sum a=",sum_a);
    printf("%s %d\n","sum b=",sum_b);
    fclose(fp);
}
49K
18 августа 2009 года
JeVeL
7 / / 07.08.2009
Спасибо Только что это
Цитата:
char *name = new char[200]; // не забываем выделять память под строку!


я оставил char *name[200] и работает нормально. Благодарю за помощь:)

49K
20 августа 2009 года
JeVeL
7 / / 07.08.2009
Вот столкнулся с тем что sum_b имеет большое значение ,
большее чем допустимое unsigned long = 4294967295 :( Конечно я могу в цикле делить выводить sum_b1, sum_b2 и т.д.,где каждая sum имеет тип unsigned long , а потом суммировать вручную ...
Есть ли способ обойти это??? (DevCpp, 32битная OS)
12K
20 августа 2009 года
Ghox
297 / / 26.07.2009
Есть тип long long (можно и unsigned long long), размерностью 64 бита (не 32 как long int) и может хранить числа до 2 ^ 64 - 1 (если беззнаковый тип), правда старые компиляторы его могут не поддерживать.
В случае GCC, которым я пользуюсь, переменную такого типа можно объявить например unsigned long long sum_b или unsigned __int64 sum_b.
Насчет вашего компилятора - не могу сказать получится ли, но можете попробовать.
297
20 августа 2009 года
koodeer
1.2K / / 02.05.2009
Дополню. После указания типа long long или __int64 нужно будет изменить формат вывода этого типа в printf. Вроде бы в разных компиляторах есть различия. В MS VC++ можно написать так:
 
Код:
printf("%s %I64d\n","sum b=",sum_b);

Или можно сделать вывод 64-битного значения с помощью cout:
 
Код:
#include <iostream>
...
std::cout << "sum_b=" << sum_b << std::endl;



PS: char *name[200] - выделяет память для 200 указателей на тип char, т. е. 200*4 = 800 байт
49K
20 августа 2009 года
JeVeL
7 / / 07.08.2009
Спасибо я уже разобрался , знал о long long но думал что использовать только на 64 битных осях:D И мой DevCpp не захотел работать с unsigned __int64
вернее программа выдает сумму произвольно
А вот VS2005 , оказавшийся под рукой , с тем же кодом скомпилил нормально;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог