2016-02-01 5 views
0

Я создал приложение DirectX12 по умолчанию (вращающийся 3D куб) и в моем void DX::DeviceResources::Present() я пытаюсь написать BackBuffer в файл:C ofstream ++: Не удается найти файл вывода

// Present the contents of the swap chain to the screen. 
void DX::DeviceResources::Present() 
{ 
    // The first argument instructs DXGI to block until VSync, putting the application 
    // to sleep until the next VSync. This ensures we don't waste any cycles rendering 
    // frames that will never be displayed to the screen. 
    HRESULT hr = m_swapChain->Present(1, 0); 

    UINT backBufferIndex = m_swapChain->GetCurrentBackBufferIndex(); 
    ComPtr<ID3D12Resource>   spBackBuffer; 
    m_swapChain->GetBuffer(backBufferIndex, IID_PPV_ARGS(&spBackBuffer)); 

    //before writing the buffer, I want to check that the file is being 
    //created 
    ofstream myfile; 
    myfile.open("WHEREISTHEFILE.txt"); 
    myfile << "Writing this to a file.\n"; 
    myfile.close(); 

    // If the device was removed either by a disconnection or a driver upgrade, we 
    // must recreate all device resources. 
    if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) 
    { 
     m_deviceRemoved = true; 
    } 
    else 
    { 
     DX::ThrowIfFailed(hr); 

     MoveToNextFrame(); 
    } 
} 

Проблема происходит здесь:

ofstream myfile; 
myfile.open("WHEREISTHEFILE.txt"); 
myfile << "Writing this to a file.\n"; 
myfile.close(); 

Я просто хочу, чтобы написать файл первым (как было показано, как here), прежде чем пытаться записать содержимое буфера. Теперь по какой-то причине я не могу найти выходной файл ... Я искал всюду, все каталоги в моем проекте и даже в папке Microsoft DirectX SDK.

Исключений нет, и я могу проходить каждую строку во время отладки без ошибок.

Где это может быть?

+0

проверить каталог выполнения, обычно устанавливаемый в опции «start in» –

ответ

1

Где это может быть?

Обычно местоположение файла относительно текущего рабочего каталога, то есть WHEREISTHEFILE.txt должны быть расположены в любом каталоге вы были, когда вы начали программу.

Вы можете определить этот каталог внутри своей программы через GetCurrentDirectory() и изменить его на что-то еще через SetCurrentDirectory().

Но вы не проверяли, успешно ли был .open(), так что запись могла вообще не удалась, например, из-за недостаточных разрешений ...?!

+0

Спасибо. Я проверил, есть ли fromstream.is_open == false, и это ... Я запускаюсь в режиме администратора, добавил права доступа к каталогу вручную, давая полный контроль «всем», но is_open все еще всегда false. – pookie

+0

@pookie: проверьте также [this] (http://stackoverflow.com/questions/5835848/when-will-ofstreamopen-fail) ответ для получения дополнительной информации о возможных ошибках плюс, конечно, официальная страница Linux о ['open (2) '] (http://linux.die.net/man/2/open). – Michael

+0

@pookie: Запуск самозанятого, непроверенного программного обеспечения в режиме администратора (где он может разрушить * все * в вашей системе) является ** плохой идеей. Не делайте этого **. Ну, что произойдет, если вы укажете * абсолютный путь?Что такое * * результат 'GetCurrentDirectory()' в момент, когда вы пытаетесь открыть файл? Возможно, вы захотите попробовать [fopen()] (http://en.cppreference.com/w/cpp/io/c/fopen), а затем ['perror()'] (http://en.cppreference.com/w/cpp/io/c/perror) вместо этого получить сообщение об ошибке (хотя я не уверен, что Windows * * устанавливает 'errno', это требование POSIX, а не стандартное). – DevSolar

1

Он должен быть в каталоге вашего проекта. Если вы используете Visual Studio, вы можете щелкнуть правой кнопкой мыши свое решение и нажать «Открыть папку» в «Проводнике файлов».

Изображение: Open folder in File explorer

(я встроил это так, потому что мне нужно 10 репутации для размещения изображения непосредственно)

Также с кодом сейчас, нет никакого способа определить, является ли ваша программа фактически в состоянии для открытия выходного файла или нет. Я предлагаю вам использовать что-то вроде этого:

std::ofstream outputFile("./myOutput.txt"); 
    if (outputFile.fail()) 
    { 
     std::cout << "Failed to open outputfile.\n"; 
    } 
outputFile << "I like trains."; 
outputFile.close(); 

Первая строка является инициализация, которая делает то же самое, как .Open(). Также обратите внимание на «./» перед дорогой, это не должно быть обязательным, но это не помешает сделать это (это означает ваш текущий каталог). Важной частью этого фрагмента кода является проверка .fail(), если ваша программа не открыла выходной файл, вы, конечно же, не сможете ее найти. Надеюсь, это помогло!

+0

Спасибо, но с тех пор я обнаружил, что outputFile.is_open всегда false, поэтому по какой-то причине я не могу даже создать файл! ;) – pookie

+0

Aah Я только что видел, как вы ответили на другой ответ, когда я сам пробовал себя в Visual studio. Вы пытались сначала создать файл .txt вручную в своем рабочем каталоге, а затем (в коде) открыть его и написать ему? –

+0

Да, пробовал, что;) не повезло ... все еще не может открыть файл или написать кому-нибудь! – pookie

Смежные вопросы