Форум программистов, компьютерный форум CyberForum.ru

Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом - C++

Восстановить пароль Регистрация
 
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
28.05.2011, 15:56     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #1
Собстно ошибко "Project '...' raised exception class EAccessViolation with message 'Access violation at address 00401464 Write of address 004040bc'. Process stopped. Use..."
Компилируется нормально, всё работает. Ошибка вылетает при выборе сортировки, подсвечивается строчка 19 "data [ j ] = temp;" Билдер вешается..

структура
C++
1
2
3
4
5
6
7
8
struct telephone
{
        char name[30];
        char adr[40];
        long int number;
};
 
struct telephone data;
сортировка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//-------------------------------------SORT-------------------------------------
 
void qs_struct ( struct telephone data [] , int left, int right )
{
 
   register int i, j;
   char *x;
   struct  telephone temp;
 
   i = left; j = right;
   x = data [( left+right ) / 2 ] .name;
 
   do {
     while (( strcmp ( data [ i ] .name,x ) < 0 ) && ( i < right )) i++;
     while (( strcmp ( data [ j ] .name,x ) > 0 ) && ( j > left )) j--;
     if ( i <= j ) {
       temp = data [ i ] ;
       data [ i ] = data [ j ];
       data [ j ] = temp;
       i++; j--;
     }
   } while ( i <= j ) ;
 
   if ( left < j ) qs_struct ( data, left, j ) ;
   if ( i < right ) qs_struct ( data, i, right ) ;
}
 
void quick_struct ( struct telephone data [] , int count )
{
   qs_struct ( data, 0 ,count- 1 ) ;
}
main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
main()
{
 FILE *t,*f;
 char another,choice;
 char cname[30];
 long int n;
 long int recsize;
 int z;
 int i,j,a,m,fl,l;
 t=fopen("TELEPHONE.DAT","rb+");
 if(t==NULL)
 {
       t=fopen("TELEPHONE.DAT","wb+");
       if(t==NULL)
       {
         printf("Error, File can't open\n");
         getch();
         }
         }
 recsize=sizeof(data);
 while(1)
 {
   fflush(stdin);
   int p = Menu();
   switch(p)
...
 
case 7:
           rewind(t);
           quick_struct(&data,recsize);
           fflush(stdin);
           break;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2011, 15:56     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом
Посмотрите здесь:

отсортировать каждый столбец матрицы по возрастанию элементов методом "пузырька" C++
C++ Отсортировать массив по убыванию методом "пузырька"
Непонятная ошибка "Access violation writing location 0xcdcdcdd5" C++
Как можно найти итерацию, на которой происходит "access violation reading location"? C++
C++ Ошибка "Unhandled exception, Access violation writing location"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
29.05.2011, 23:02  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #2
метод сортировки подсмотрел у пиндосов...
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
30.05.2011, 00:17     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #3
C++
1
2
3
4
5
6
7
8
9
struct telephone data;
...
void quick_struct ( struct telephone data [] , int count );
...
long int recsize;
...
recsize=sizeof(data);
...
quick_struct(&data,recsize);
Если я правильно понял выше процитированное, то функция ждёт указатель на массив записей и число, равное количеству записей.
При этом в функцию передаётся указатель на единственную запись и число, равное размеру записи в байтах. Я бы тоже выпал с ошибкой
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
30.05.2011, 00:31  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #4
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если я правильно понял выше процитированное, то функция ждёт указатель на массив записей и число, равное количеству записей.
При этом в функцию передаётся указатель на единственную запись и число, равное размеру записи в байтах. Я бы тоже выпал с ошибкой
то есть надо сначала достать структуру из файла в массив, посчитать кол-во эл-ов, передать ф-ции сортировки и запихнуть отсортированный массив обратно в файл?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
30.05.2011, 00:35     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #5
Ну вроде так. Массив из структур, заполняем записи, сортируем, выгружаем.
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
31.05.2011, 02:28  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #6
если не сложно, подскажите как массив из структур создавать. а то дальше
C++
1
2
3
rewind(t);
while(fread(&data,recsize,1,t)==1)
        {
дело не пошло
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
03.06.2011, 11:52  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #7
пошло вот так....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int n=1   ;
        rewind(t);
        while(fread(&data,recsize,1,t)==1)
        {
              n++;
        }
 
         telephone * dataArray = new telephone[n];
 
         //fflush(stdin);
 
         rewind(t);
         i=1 ;
         while(fread(&data,recsize,1,t)==1)
        {
        strncpy(dataArray[i].name, data.name, 30);
        strncpy(dataArray[i].adr, data.adr, 40);
        dataArray[i].number = data.number;
        i++;
        }
а теперь как бы отсортированный массив назад засунуть?

Добавлено через 13 часов 26 минут
пробовал strcpy+fwrite, strncpy, fputs не проходит...
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:26     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #8
если количество известно заранее
telephone data[10];
если количество узнаем позже то например можно сначала посчитать количество строк в файле (если 1 строка на 1 структуру)
затем telephone *data = (telephone*)calloc(sizeof(telephone),count);
затем rewind(t);


заполнять можно так:
C
1
2
for (int i=0; i<count; i++)
fscanf(file,"%s%s%ld",data[i].name,data[i].adr,&data[i].number); // медленно но верно
также можно попробывать читать и сразу заполнять,
тогда придется мутить с realloc-ами, каждый раз перераспределять память на (++count)+sizeof(telephone);



упс... прочитал щас и понял что это вы уже сделали.
только вот брр
Цитата Сообщение от Alaraf Посмотреть сообщение
while(fread(&data,recsize,1,t)==1) {
strncpy(dataArray[i].name, data.name, 30);
strncpy(dataArray[i].adr, data.adr, 40);
dataArray[i].number = data.number; i++;
}
можно было сразу в dataArray пихать

Цитата Сообщение от Alaraf Посмотреть сообщение
а теперь как бы отсортированный массив назад засунуть?
очень просто.

freopen... режим очистки + записи

сортируем. (это сделано?)
затем в цикле
fprintf(t,"%s %s %ld\n",data[i].name,data[i].adr,data[i].number);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 08:27     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом
Еще ссылки по теме:

C++ Ошибка "Ascess violation" при выводе массива
Ошибка "Access violation writing location" при работе с массивом. C++
C++ Ошибка компилятора: "Access violation writing location"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
11.06.2011, 08:27  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #9
попробовал зайти с другого конца, с использованием temp файла...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{ case 7:
        int m=1;
        rewind(t);
        while(fread(&data,recsize,1,t)==1)
        {
              m++;
        }
         fflush(stdin);
         telephone * dataArray = new telephone[m];
         rewind(t);
        int i=1 ;
         while(fread(&data,recsize,1,t)==1)
        {
        strncpy(dataArray[i].name, data.name,30-1);
        strncpy(dataArray[i].adr, data.adr,40-1);
        strncpy(dataArray[i].number, data.number,10-1);
        i++;
        }
 
        for(i=1; i<m; i++)
        {
        printf("\n %-12d %-17s %-22s %14s       \n",i,dataArray[i].name, dataArray[i].adr, dataArray[i].number);
        }
        getche();
 
        qs_struct (dataArray,1,m);
        printf("\n *******Sorting*******\n");
        for(i=1; i<m; i++)
        {
        printf("\n  %-12d %-17s %-22s %14s       \n",i,dataArray[i].name, dataArray[i].adr, dataArray[i].number);
        }
        getche();
 
        i=1;
        f=fopen("TEMP.DAT","wb");
 
        rewind(t);
        while(fread(&data,recsize,1,t)==1)
        {
          fwrite(&dataArray[i],recsize,1,f);
          i++;
        }
        fclose(t);
        fclose(f);
        remove("TELEPHONE.DAT");
        rename("TEMP.DAT","TELEPHONE.DAT");
        t=fopen("TELEPHONE","rb+");
        fflush(stdin);
        break;
  }
Добавлено через 11 минут
Цитата Сообщение от Alaraf Посмотреть сообщение
t=fopen("TELEPHONE","rb+");
в смысле TELEPHONE.DAT
Yandex
Объявления
11.06.2011, 08:27     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом
Ответ Создать тему
Опции темы

Текущее время: 16:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru