Указатель 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. Теперь это работает на меня.:) Еще раз спасибо.