Нарушение Прав Доступа

Тема в разделе "MS Visual C++", создана пользователем Negent, 18 июл 2014.

  1. Negent

    Negent New Member

    Регистрация:
    9 дек 2011
    Сообщения:
    2
    Симпатии:
    0
    Доброго времени суток, уважаемые программисты!
    Вкратце: шефом была поставлена задача выяснить остатки витой пары на складе... Однако простое суммирование - это не наш метод, поэтому я написал программу, которая считывает длины из файла и потом суммирует эти длины, далее, сортирует в порядке возрастания и в будущем (надо написать часть) записывает массив в файл.
    Однако я получил сумму и сбой "Необработанное исключение. Нарушение прав доступа".
    Прошу помочь, подсказать, где ошибка в цикле, использующем "while". Компилятор (MS Visual C++ 2010) спотыкается именно там.
    Код (C++):
    #include "stdafx.h"
    #include <fstream>
    #include <iostream>


    using namespace std;

    void main ()
    {

    ifstream FromFile;
    FromFile.open ("spisok.txt");
    if (!FromFile.is_open())
    {
    cout<<"File not found!";
    exit(EXIT_FAILURE);
    }
    //Инициализация массива и счётчика
    int const size = 100;
    double arr[size];
    int i = 0;
    double sum = 0;
    double TempValue = 0;
    //Считывание элементов массива
    while (FromFile.good ())
    {
    FromFile>>TempValue;
    arr[i] = TempValue;
    cout<<TempValue<<" ";
    sum +=TempValue;
    cout<<"Sum: "<<sum<<endl;
    i++;
    }
    if (FromFile.eof()) cout<<"End of file!"<<endl;
    else if (FromFile.fail ()) cout<<"Type mismatch!"<<endl;
    else if (sum == 0) cout<<"No data!"<<endl;
    else cout<<"Unknown error!"<<endl;
    //Сортировка элементов массива
    for (i=0; i<size-1; i++)
    {
    if (arr[i]>arr[i+1])
    {
    TempValue = arr[i+1];
    arr[i+1] = arr[i];
    arr[i] = TempValue;
    }
    }
    i=0;
    while (i<size-1)
    {
    cout<<"arr["<<i+1<<"] = "<<arr[i]<<" ";
    i++;
    }
    system ("pause");
    }
    Файл, простой текстовый со следующими данными:
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Допустим, у тебя в файле 20 значений.
    Код (Text):
    while (FromFile.good ())
    {
    FromFile>>TempValue;
    arr[i] = TempValue;
    cout<<TempValue<<" ";
    sum +=TempValue;
    cout<<"Sum: "<<sum<<endl;
    i++;
    }
    Тут все верно, будут инициализированы 20 первых элементов массива

    Код (C++):
    for (i=0; i<size-1; i++)
    Тут ты ошибку, т.к. пытаешься суммировать не 20 элементов, а все 100 (в последних 80 хранится мусор)

    Сходу заметил это, но к нарушению прав доступа...это вроде бы не должно приводить...



    Добавлено: Я бы заменил массив на список и вместо пузырьковой сортировки взял стандартную (она гораздо эффективнее)

    Код (Text):
    double sum = 0;
    double TempValue = 0;
    Переменные не называй с большой буквы. Или делай как-нибудь единообразно, а-то одна переменная так, другая - иначе.
     
  3. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (C++):
    #include <fstream>
    #include <iostream>
    #include <list>
    #include <algorithm>
    using namespace std;

    int main () {
    ifstream ifst("input.txt");
    ofstream ofst("output.txt");

    list<double> lens; // список длин
    double sum(0);

    if (false == ifst.is_open()) {
    cout<<"File not found!";
    return -1;
    }

    // считывание длин
    while (ifst.eof() == false) {
    double tmp;
    ifst >> tmp;
    lens.push_back(tmp);
    }

    // вычисление суммы длин
    for (auto t : lens)
    sum += t;

    cout << "sum: " << sum << endl;

    // сортировка длин
    lens.sort();

    // записывает длины в файл
    for (auto t : lens)
    ofst << t << ' ';
    }
    Часть твоего кода я сохранил.

    Проверил так:
    Тут используется for по коллекции, поэтому надо C++11 подключить. Как-то в студии это делается (надо где-то в настройках полазить и галочки потыкать).
     
Загрузка...

Поделиться этой страницей