ifstream пропускает числа и просто пишет 0 - PullRequest
0 голосов
/ 11 января 2020

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

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
struct info
{
string pavadinimas;
double benzinas, dujos, sumad, sumab,km, dujk,benzk, suma;

};
void skaityk (int &n, info S[], double dujk, double benzk, double km)
{
    ifstream fd ("Duomenys.txt");
    fd>>dujk >>benzk>> km;
    fd>> n;
    for (int i=1; i<=n; i++)
    {
         fd.ignore(80, '\n');
         char simb [15];
         fd.get (simb, 15);
         S[i].pavadinimas=simb;
         fd>>S[i].benzinas>>S[i].dujos;
    }
    fd.close();
}

содержимое текстового файла:

8.4 10.1 500 3
Orlen          4.56 2.32
Neste          4.66 2.43
Saurida        4.65 2.44

, и я хочу взять 3 первых числа и сосчитать их, но они просто получаются равными 0 независимо от того, что Я делаю и без fd>>dujk >>benzk>> km; все портится, поэтому я действительно запутался в том, что делать. Меня спросили полный код, поэтому вот оно:

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
struct info
{
string pavadinimas;
double benzinas, dujos, sumad, sumab,km, dujk,benzk, suma;

};
void skaityk (int &n, info S[], double &dujk, double &benzk, double &km)
{
    ifstream fd ("Duomenys.txt");
    fd>>dujk >>benzk>> km;
    fd>> n;
    for (int i=1; i<=n; i++)
    {
         fd.ignore(80, '\n');
         char simb [15];
         fd.get (simb, 15);
         S[i].pavadinimas=simb;
         fd>>S[i].benzinas>>S[i].dujos;
    }
    fd.close();
}
void rasyk (int n , info S[], double suma)
{
    ofstream fr ("Rezultatai.txt");
    fr<<fixed<<setprecision(2)<<suma<<endl;
    for (int i=1; i<=n; i++)
    fr<<S[i].pavadinimas<<fixed<<setw(8)<<setprecision(2)<<S[i].sumad;
};
double sumuokd (int n,info S[])
{
   double s=0;
   for (int i=1; i<=n; i++)
   {
       S[i].sumad=S[i].dujk*S[i].km*S[i].dujos;
   }
};
int main()
{
    int n;
    info S[101];
    double dujk, benzk, km;
    skaityk(n,S, dujk, benzk, km);
    for (int i=1; i<=n; i++)
       cout<<S[i].pavadinimas<<fixed<<setw(8)<<setprecision(2)<<S[i].benzinas<<fixed<<setw(8)<<setprecision(2)<<S[i].dujos<<endl<<S[i].sumad<<endl;
    return 0;
}

со строкой без линии

1 Ответ

1 голос
/ 11 января 2020

Прежде всего, таблицы в C ++ начинаются с 0, поэтому все ваши циклы for должны быть изменены с:

for (int i=1; i<=n; i++)

на:

for (int i=0; i<n; i++)

Тогда, если вы хотите получить dujk, benzk, km значений из функции, вам нужно использовать ссылки (&) перед каждым значением, которое вы хотите передать из функции:

void skaityk (int &n, info S[], double & dujk, double & benzk, double & km)

Код после следующих модификаций выведет

Orlen             4.56    2.32
Neste             4.66    2.43
Saurida           4.65    2.44 

И последнее, но не менее важное: лучше использовать std :: vector вместо простого массива.

...