В моей программе я пытаюсь сгенерировать случайное имя файла, а затем использую fopen для создания файла с этим именем. Процесс идет следующим образом
- Создать случайное имя файла
- Проверьте, не являемся ли мы администратором, попытавшись создать файл с таким именем в c: \
- Записать материал в файл
Для создания случайного имени файла я использую следующую функцию:
const char *RandomName(const char *suffix,unsigned int length)
{
const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
int stringLength = sizeof(alphanum) - 1;
std::string Str;
unsigned int i;
Str.append("c:\\");
for( i = 0; i < length; ++i)
{
Str += alphanum[rand() % stringLength];
}
Str += suffix;
const char *str =Str.c_str();
return str;
}
Для создания файла и проверки наличия администратора я использую следующую функцию:
bool IsAdmin()
{
const char *n = RandomName(".BIN",5);
cout << n << endl;
FILE *fp;
fp = fopen((const char *)n,"w+");
if (fp == NULL) {
cout << "File pointer was NULL" << endl;
return false;
} else {
cout << "File pointer is legit" << endl;
//fclose(fp);
//remove(n);
int b;
for(b = 0; b != 1338; b++)
{
char f = 'c';
fputc(f, fp);
}
return true;
}
}
При запуске от имени администратора программа печатает:
c:\9UswA.BIN Not Admin!
Как заставить программу создать файл с именем, которое соответствует отображаемому на экране? и без схематичного поведения?
3 ответа
Чтобы решить эту проблему, я избавился от функции RandomName
и отредактировал IsAdmin
, чтобы включить ее код, с помощью нескольких настроек, которые мне удалось заставить ее работать хотя бы несколько хорошо, код, который я закончил с было:
void AdminWrite(const char *suffix,unsigned int length)
{
FILE *fp;
const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv";
int stringLength = sizeof(alphanum) - 1;
std::string Str;
unsigned int i;
Str.append("c:\\Users\\UserName\\Desktop\\");
for( i = 0; i < length; ++i)
{
Str += alphanum[rand() % stringLength];
}
Str += suffix;
const char *str =Str.c_str();
cout << str << endl;
fp = fopen(str,"w+");
if (fp == NULL) {
cout << "File pointer was NULL" << endl;
return;
} else {
cout << "File pointer is legit" << endl;
int b;
for(b = 0; b != 1337; b++)
{
char f = 'c';
fputc(f, fp);
}
return;
}
return;
}
Я думаю, что запуск созданного здесь .exe от имени администратора позволит вам создать файл. Запустите программу не из любой IDE, а вручную из местоположения файла и запустите от имени администратора.
Просто используйте tmpnam c api
Пример:
#include <stdio.h>
int main(void)
{
char name[40];
int i;
for(i=0; i<3; i++) {
tmpnam(name);
printf("%s ", name);
}
return 0;
}
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.