Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2011, 15:42   #1
Borsch
 
Регистрация: 22.05.2011
Сообщений: 3
Стрелка Бинарные файлы и Stack around the variable was corrupted

Добрый день.
Делаю программу (лабу), которая работает с бинарными файлами:
Сначала заполняет бинарный файл случайным количеством случайных чисел, а затем - считывает этот файл, из последних его элементов строит матрицу из 25 элементов (5х5), а также подсчитывает сумму отрицательных элементов под главной диагональю.
Компилятор MS Visual Studio 2010 при выходе из функции SetTheFile ругается на переменную buffer.
Пишет диалоговое окно: Stack around the variable 'buffer' was corrupted.
Подскажите, отчего это и как можно исправить?
Причем, если в этом диалоговом окне нажать Continue - программа продолжит работать как положено.
Код:
#include <iostream>
#include <fstream>
#include <stdio.h>
//#include <iomanip>

using namespace std;
#define BEFFERATOR 2
#define randomize() (srand(time(0))) 

int SetTheFile();
int SetTheMatrix();

//шапка-меню
int main() 
{cout<<endl<<"=Work with Binary Files="<<endl;
  int choiz;
  while (true) 
  {

	cout<<endl<<"Input 1 to create binary file"<<endl;
	cout<<"Input 2 to set matrix from file"<<endl;
	cout<<"Input 3 EXIT!"<<endl<<endl;
	//  srand(time(0));


    while (true) 
	{
      cout<<"Think wisely and make your choice: ";
	  cin>>choiz;
	  if (choiz==1 || choiz==2 || choiz==3) break;
      cout<<"Error. So sad."<<endl;
    }
    switch (choiz) 
	{
      case 1: SetTheFile();    break;
      case 2: SetTheMatrix();  break;
      case 3: return 0;
      default: continue;
    }
  }
}

int SetTheFile() 
{
//  system("cls");

  FILE *p=fopen("sardelki.bin", "wb");
  
  char buffer[BEFFERATOR];

  int j;
  j=rand()%10 + 20;
  cout<<endl<<" Chisel zadano: "<<j<<endl;

  for (int i=0; i<j; i++) 
  {
	 
	itoa(rand()%10-5,buffer,10);
    fwrite (buffer, 1, sizeof(buffer), p);

    printf("%s ", buffer);
  }
  if (j<25)
  {
  cout<<endl<<"WARNING! Chisel menshe 25. Matrix uncreateble";
  cout<<endl<<"Recomendutsa poprobovat' escho raz";
  }
  fclose (p);
  printf("\n");
  system("pause");
  
  return 0;
} //Ругается прям в этой строке

int SetTheMatrix() 
{
  //system("cls");

  FILE *p=fopen("sardelki.bin", "rb");
  
 // rewind(p);
  fseek(p, 0, SEEK_SET);
  char buffer[BEFFERATOR];
  int numbers[5][5]={0};
  int i, j;
  printf("Matrix, built from binary p:\n");
  for (i=0; i<5; i++) {
    for (j=0; j<5; j++) {
      fseek(p, EOF-1-BEFFERATOR*(i*5+j), SEEK_END);
      fread (buffer, 1, sizeof(buffer), p);
      numbers[i][j]=atoi(buffer);
	  //atoi = string -> integer, int
      printf("%4d ", numbers[i][j]);
    }
    printf("\n");
  }
  fclose (p);

  int sum=0;
  for (i=1; i<5; i++)
    for (j=0; j<i; j++)
		if (numbers[i][j]<0)
      sum+=numbers[i][j];
  printf("Sum: %d.", sum);

  printf("\n");
  system("pause");
  return 0;
}
Приму критику и советы по оптимизации кода) Ибо громоздко как-то оно всё. Но главная цель - исправить краш стека.
И еще дополнительно интересует... как реализовать, чтобы строить матрицу не с конца файла, а с элемента файла, указанного пользователем? Т.е. задаст счетчик рандомно 50 чисел, пользователь введёт например число 10, и чтоб матрица 5х5 составлялась из элементов с 10 по 35.
Borsch вне форума Ответить с цитированием
Старый 04.06.2011, 16:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
itoa(rand()%10-5,buffer,10);
Подумайте сколько символов займет отрицатльное число с \0 (концом строки).
p51x вне форума Ответить с цитированием
Старый 04.06.2011, 16:23   #3
Borsch
 
Регистрация: 22.05.2011
Сообщений: 3
По умолчанию

Ага, нуль-символ. Т.е. получается я буфер делаю размером 2 символа, к отрицательному числу помимо знака и цифры ещё и нуль-символ прибавляется, итого получается 3 символа. Понятно.

А как безболезненно исправить?
Если в define значении BEFFERATOR поставить 3, вместо 2, а в fread и fwrite в параметрах использовать sizeof(buffer)-1, оно перестаёт ругаться на краш стека, но начинает ненормально стоить матрицу, т.е. из абсолютно левых значений.

Последний раз редактировалось Borsch; 04.06.2011 в 16:37.
Borsch вне форума Ответить с цитированием
Старый 04.06.2011, 16:54   #4
Borsch
 
Регистрация: 22.05.2011
Сообщений: 3
По умолчанию

UPD Получилось. Установил размер #define BEFFERATOR 4, вместо #define BEFFERATOR 2.
А строку fseek(p, EOF-1-BEFFERATOR*(i*5+j), SEEK_END); заменил на fseek(p, EOF-3-BEFFERATOR*(i*5+j), SEEK_END);

Благодарю за наводку про нуль-символы и размер буфера.
Borsch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
run-time error 91 (object variable or with block variable not set) mrs.petrushina Microsoft Office Access 5 19.04.2011 12:59
run-time error 91 (object variable or with block variable not set) mrs.petrushina Microsoft Office Excel 7 05.04.2011 00:22
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. Gidross Общие вопросы C/C++ 9 28.12.2010 15:22
un-time check failure #2-stack around the variable 't' was corrupted Despar Помощь студентам 1 13.05.2010 10:17
run-time check failure #2-stack around the variable 't' was corrupted Despar Общие вопросы C/C++ 1 13.05.2010 08:33