2013-05-08 1 views
-1

Моя программа читает текстовый файл по строкам, чтобы получить информацию о группе людей, которые сделали пожертвования. Он использует массив структур для хранения информации (имя, сумма пожертвования). В первой строке текстового файла указано количество участников. С тех пор строки обозначают имя и ценность пожертвования. например:Моя программа дает мне ошибку сегментации (C++)

3 
Kyle Butler 
10340 
James Wright 
5006 
John Smith 
10000 

Затем, если их пожертвования 10000 или более, их название и значение донорства выводится на экран под заголовком «великие покровители» в противном случае, он появляется под заголовком «меценатов»

Проблема в том, что когда я запускаю программу, она дает мне ошибку сегментации без каких-либо доказательств, что программа выводит что-либо на экран. Может кто-нибудь, пожалуйста, скажите мне, что здесь происходит? Я довольно новичок в языке.

#include <iostream> 
#include <string> 
#include <fstream> 
#include <cstring> 
#include <cctype> 
#include <cstdlib> 

using namespace std; 

struct contribute { 
    char Name[100]; 
    int contribution; 
}; 

int main() 
{ 

    char tempstore[100]; 
    int linecount=1; 
    int pointerindex=0; 
    ifstream inputfile("myfile.txt"); 

    if (!inputfile.is_open()){ 
     cout << "Error opening file"; 
    } 

    inputfile.getline(tempstore, 20); 
    int contributors = atoi(tempstore); 
    contribute carray[contributors]; 

    while (!inputfile.eof()){ 
     if(linecount ==1){ 
      linecount++; 
      continue; 
     } 

     inputfile.getline(tempstore, 20); 


     if ((linecount % 2) == 0){ 
      strcpy((carray[pointerindex]).Name, tempstore); 

     } 
     else { 
      (carray[pointerindex]).contribution = atoi(tempstore); 
     } 


     ++linecount; 
     ++pointerindex; 
    } 




    cout << "\n#####--#-Grand Patrons-#--#####\n"; 

    for (int i=0; i<contributors; i++){ 
     if (carray[i].contribution >= 10000){ 
      cout << "Name: " << carray[i].Name << endl; 
      cout << "Contribution: " << carray[i].contribution << endl << endl; 
     } 
    } 

    cout << "\n#####--#-Patrons-#--#####\n"; 

    for (int d=0; d<contributors; d++){ 
     if (carray[d].contribution < 10000){ 
      cout << "Name: " << carray[d].Name << endl; 
      cout << "Contribution: " << carray[d].contribution << endl << endl; 
     } 
    } 

    inputfile.close(); 

    return 0; 
} 
+2

Какая линия неисправна? Вы пытались запустить его в отладчике? Какую IDE, ОС вы используете? – OldProgrammer

+1

вносить карри [вкладчики]; Ваш компилятор позволит вам это сделать? Не следует ли вносить свой вклад * carray = new contrib [contributers]; ? –

+0

@JonathanHenson Нет, это не динамический массив, а всего лишь массив структур, я изначально использовал динамический массив, но я думал, что это может быть причиной segfault, поэтому я перешел на статический. Работает в любом случае. –

ответ

0

Вы приращением pointerindex на каждом проходе цикла, а не только после того, как вы читаете в суммах взносов. Итак, к тому времени, когда вы доберетесь до 5006, у вас есть pointerindex == 3, что вызывает segfault на carray[pointerindex].

Переместить ++pointerindex в заявление else.

+0

Большое вам спасибо! Я знал, что это будет что-то простое, и это внезапно имеет такой смысл! –