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

Negent

New Member
09.12.2011
2
0
#1
Доброго времени суток, уважаемые программисты!
Вкратце: шефом была поставлена задача выяснить остатки витой пары на складе... Однако простое суммирование - это не наш метод, поэтому я написал программу, которая считывает длины из файла и потом суммирует эти длины, далее, сортирует в порядке возрастания и в будущем (надо написать часть) записывает массив в файл.
Однако я получил сумму и сбой "Необработанное исключение. Нарушение прав доступа".
Прошу помочь, подсказать, где ошибка в цикле, использующем "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");
}
Файл, простой текстовый со следующими данными:
140 108 50 21 20 15 11 32 14 14 9 7 10 4.5 8 6 4 16 6 3 7 5.2 5 4 5 8 6 9.5 7 4.2 4.5 8 5 5 5 7 13 13 7 4 9 5 7 8 4 13 13 6 8 5 5 5 18 9 10 6 8 10 19 13 9 10 13 23 13 14 14 10 27 12 21 9 22 31 10 10 89 7 4 4 4 5 3.9 35 5 8 6 4.2 4 15 5 5 7.5 9 11 4 4 3 14 11 2 11 2.5 13 10 5 5 13 0
 
R

rrrFer

Гость
#2
Допустим, у тебя в файле 20 значений.
Код:
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 хранится мусор)

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



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

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

rrrFer

Гость
#3
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 << ' ';
}
Часть твоего кода я сохранил.

Проверил так:
rrrfer@linux-2oyq:~/project> cat input.txt
140 108 50 21 20 15 11 32 14 14 9 7 10 4.5 8 6 4 16 6 3 7 5.2 5 4 5 8 6 9.5 7 4.2 4.5 8 5 5 5 7 13 13 7 4 9 5 7 8 4 13 13 6 8 5 5 5 18 9 10 6 8 10 19 13 9 10 13 23 13 14 14 10 27 12 21 9 22 31 10 10 89 7 4 4 4 5 3.9 35 5 8 6 4.2 4 15 5 5 7.5 9 11 4 4 3 14 11 2 11 2.5 13 10 5 5 13 0
rrfer@linux-2oyq:~/project> cat output.txt
rrrfer@linux-2oyq:~/project> g++ main.cpp -o main -std=c++11
rrrfer@linux-2oyq:~/project> ./main
sum: 1389
rrrfer@linux-2oyq:~/project> cat input.txt
140 108 50 21 20 15 11 32 14 14 9 7 10 4.5 8 6 4 16 6 3 7 5.2 5 4 5 8 6 9.5 7 4.2 4.5 8 5 5 5 7 13 13 7 4 9 5 7 8 4 13 13 6 8 5 5 5 18 9 10 6 8 10 19 13 9 10 13 23 13 14 14 10 27 12 21 9 22 31 10 10 89 7 4 4 4 5 3.9 35 5 8 6 4.2 4 15 5 5 7.5 9 11 4 4 3 14 11 2 11 2.5 13 10 5 5 13 0
rrrfer@linux-2oyq:~cat output.txt
0 2 2.5 3 3 3.9 4 4 4 4 4 4 4 4 4 4 4.2 4.2 4.5 4.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5.2 6 6 6 6 6 6 7 7 7 7 7 7 7 7.5 8 8 8 8 8 8 8 9 9 9 9 9 9 9.5 10 10 10 10 10 10 10 10 11 11 11 11 12 13 13 13 13 13 13 13 13 13 14 14 14 14 14 15 15 16 18 19 20 21 21 22 23 27 31 32 35 50
rrrfer@linux-2oyq:~/project>
Тут используется for по коллекции, поэтому надо C++11 подключить. Как-то в студии это делается (надо где-то в настройках полазить и галочки потыкать).