Вместо текущего кода:
FILE *sortie;
char fichier[256];// <--- HERE s my char table
int main(int argc, char *argv[])
{
//on masque
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);
int i, lettre, result, lastresult, lastletter, compteur;
GetCurrentDirectory(256, fichier);
strcat(fichier, "\\fichierlog.txt");
сделать, например,
auto main() -> int
{
//on masque
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);
int i, lettre, result, lastresult, lastletter, compteur;
std::wstring fichier(MAX_PATH, L'\0');// <--- HERE s my char table
const DWORD len = GetCurrentDirectory(fichier.size(), &fichier[0]);
if(len == 0 || len >= fichier.size()) { throw std::runtime_error("GetCurrentDirectory failed."); }
fichier.resize(len);
fichier += L"/fichierlog.txt";
std::ifstream sortie(fichier);
Это должно решить три вопроса:
Вы собираете в Unicode (вероятно, визуальный проект студии), но код для Windows API, ANSI.
Вы используете ++ компилятор C, но код низкого уровня C.
Слишком маленький буфер для максимальной длины пути, и возможно переполнением буфера для конкатенации.
Обратите внимание, что ifstream
конструктор, который принимает широкий строку является расширением Microsoft. Однако он будет практически необходим для компиляторов Windows C++ путем добавления файловой системы к стандартной библиотеке в C++ 17.
Ваш ответ лучше, чем мой здесь. Мне было интересно, достаточно ли инициализировать строку нулем, как в 'fichier (256, 0);' или это должно быть 'L '\ 0''? –
он уточняет мою проблему! – VAV
@BarmakShemirani: '0' и' L '\ 0'' имеют такой же эффект здесь, это просто нулевое значение, которое неявно преобразуется в 'wchar_t'. Литерал символов просто для ясности. Но я часто использую, например, 'L '#' ', чтобы более легко обнаруживать ошибки« один за другим », которые могут оставить один или несколько символов' # 'в результате. Мне еще предстоит обнаружить его, работая примерно на 20 лет с этой схемой. Но я не сдаюсь! :) –