#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");
}
Использование fscanf
Я только учусь :confused:
Помогите пожалуйста разобраться :
Код:
пример файла:
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 ? Пробовал посимвольно в массив файл считать
но потом не могу выделить нужные элементы .
Код:
#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);
}
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);
}
Цитата:
char *name = new char[200]; // не забываем выделять память под строку!
я оставил char *name[200] и работает нормально. Благодарю за помощь:)
большее чем допустимое unsigned long = 4294967295 :( Конечно я могу в цикле делить выводить sum_b1, sum_b2 и т.д.,где каждая sum имеет тип unsigned long , а потом суммировать вручную ...
Есть ли способ обойти это??? (DevCpp, 32битная OS)
В случае GCC, которым я пользуюсь, переменную такого типа можно объявить например unsigned long long sum_b или unsigned __int64 sum_b.
Насчет вашего компилятора - не могу сказать получится ли, но можете попробовать.
Код:
printf("%s %I64d\n","sum b=",sum_b);
Или можно сделать вывод 64-битного значения с помощью cout:
Код:
#include <iostream>
...
std::cout << "sum_b=" << sum_b << std::endl;
...
std::cout << "sum_b=" << sum_b << std::endl;
PS: char *name[200] - выделяет память для 200 указателей на тип char, т. е. 200*4 = 800 байт
вернее программа выдает сумму произвольно
А вот VS2005 , оказавшийся под рукой , с тем же кодом скомпилил нормально;)