Указатель FILE загадочным образом сбрасывается в NULL - PullRequest
0 голосов
/ 22 июля 2011

Я использую Visual Stduio 2008 C ++. И я пишу приложение формы Windows. Я объявляю массив FILE * в верхней части Form1.h как глобальное значение

const int k = 1; //i need to change k to 2 sometimes. 
FILE* myFiles[k]; 

В конструкторе From1 я использую цикл for, чтобы открыть мои файлы.

for(int i = 0; i < k; ++i)
{    
  char filename[100] = "";
  sprintf(filename,"Record/record_%ld_%d.txt",g_recordName,i);
  myFiles[i] = fopen(filename,"w");
}

И я установил таймер для этой формы, каждый тик которой будет выводить что-то в myFiles. Пока все хорошо, но если я поставлю что-то вроде

fprintf(myFiles[0],"%d",1234); 

в конструктор после цикла for. Это работает нормально в этой строке, но если я собираюсь fprintf что-либо в тиковом событии таймера, я обнаружил, что myFiles [0] уже имеет значение NULL !!

Кроме того, если я fprintf(myFiles[0],"something") в конструкторе, указатель FILE по-прежнему не будет нулевым в событии тика таймера.

ПОЧЕМУ это происходит ?! кто-нибудь знает почему?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Очень простой случай переполнения буфера.Выражение sprintf(filename,"Record/record_%ld_%d.txt",g_recordName,i); является наиболее вероятным виновником.

0 голосов
/ 23 июля 2011

Действительно благодаря помощи Аджая! Да, эта проблема (переполнение буфера) вызвана sprintf, fprintf. Похоже, они довольно уязвимы. Поэтому я изменил свой код, используя такие вещи, как C ++ - iostream и fstream. Теперь это работает на меня. :) Еще раз спасибо.

...