Читайте слово за словом из файла в cpp - PullRequest
1 голос
/ 21 августа 2011

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


void Read_file()
{
  int i=1;

  ifstream in_file("cust_details1.txt"); 
  if(in_file.is_open())
  {
    cout&lt&lt"List of all bills:\n"&lt&ltendl;
    while(in_file){
      cout&lt&lt"here";
      in_file &gt&gt ac_no[i];
      in_file &gt&gt ac_name[i];
      in_file &gt&gt ac_amount[i];
      in_file &gt&gt ac_emi[i];
      in_file &gt&gt ac_sanc[i];
      cout&lt&lt"Accout no = "&lt&ltac_no[i]&lt&lt" Name = "&lt&ltac_name[i]&lt&lt" Amount = "&lt&ltac_amount[i]&lt&lt" Emi = "&lt&ltac_emi[i]&lt&lt" Sanction = "&lt&ltac_sanc[i] &lt&ltendl;
      i++;
      cout&lt&lt"----------------------------------------------------"&lt&ltendl;
    }
    in_file.close();
    tot=i;
  }
  cout&lt&lt"Exiting"&lt&ltendl;
}

Этот код хорошо работает в первый раз цикла.т.е. первый набор записей хранится в массиве.Когда цикл запускается во второй раз, он сталкивается с ошибкой сегмента.here не печатается во второй раз.Все декларации сделаны правильно.

Declarations:
string ac_name[30];
int ac_no[30];
string ac_sanc[2];  // it will hold only y or n
float ac_emi[30];
int ac_amount[30];

Ответы [ 3 ]

3 голосов
/ 21 августа 2011

Ваш цикл while должен выглядеть следующим образом:

while(in_file >> ac_no[i] &&
      in_file >> ac_name[i] &&
      in_file >> ac_amount[i] &&
      in_file >> ac_emi[i] &&
      in_file >> ac_sanc[i])

    cout<<"Accout no = "<<ac_no[i]<<" Name = "<<ac_name[i]<<" Amount = "<<ac_amount[i]<<" Emi = "<<ac_emi[i]<<" Sanction = "<<ac_sanc[i]<<endl;
    i++;
}

Такой цикл гарантирует, что в случае ошибки в файле он прекратит чтение.

Кстати,Размер каждого массива должен быть достаточно большим, чтобы вместить все значения в файле.Вы объявили каждый массив размером 30, кроме string ac_sanc[2].Почему размер ac_sanc составляет всего 2?Ты знаешь, что это значит?Это означает, что ac_sanc[i] вызовет неопределенное поведение для i >=2.Ваша программа может (и, скорее всего, будет) аварийно завершить работу.Кроме того, если это может быть только y или n, то почему бы вам не объявить его как char массив?

Поскольку вы используете C ++, я бы предложил вам определить структуруи используйте std::vector следующим образом:

#include <string>
#include <vector>

struct Account
{
    std::string ac_name;
    int         ac_no;
    char        ac_sanc;
    float       ac_emi;
    int         ac_amount;
};

std::vector<Account> accounts;
Account ac;

while(in_file >> ac.ac_no &&
      in_file >> ac.ac_name &&
      in_file >> ac.ac_amount &&
      in_file >> ac.ac_emi &&
      in_file >> ac.ac_sanc)

     accounts.push_back(ac);
     //...
     //you may use 'ac' to print each values
}
1 голос
/ 21 августа 2011

Есть несколько проблем с вашим кодом.

while(in_file)

не потерпит неудачу, когда вы достигнете конца или у вас будет ошибка, вместо этого предпочтите:

while(in_file.good())

Далее:

string ac_sanc[2];  // it will hold oly y or n

Вероятно, это должно быть:

char ac_sanc[30];

Однако, как подсказал в другом месте , вам, вероятно, стоит ознакомиться с методами сериализации. Что произойдет, когда ваш "cust_details1.txt" имеет тридцать (вы используете индексы только из 1, где массивы начинаются с нуля)?

И, пожалуйста, научитесь делать отступы для своего кода!

1 голос
/ 21 августа 2011

Вы пишете во второй элемент первого цикла (ac_no[1] вместо ac_no[0].) Если ваш массив имеет размер 2, это может объяснить причину сбоя.

ЕслиВы не можете контролировать ввод, вы должны использовать std::vector и push_back или, по крайней мере, проверить, если i < arraySize, чтобы ловить подобные ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...