Указатель FILE загадочным образом сбрасывается в NULL

Я использую 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 ответа

Решение

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

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

Другие вопросы по тегам