Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Запись в файл с++

#cpp #visual_studio_2015


Прога записи в файл:

int main()
{
    setlocale(LC_ALL, "Russian");
    char recvbuf[] = "Привет!";
    std::string sstr(recvbuf);
    std::fstream myfile;
    do
    {
        myfile.open("Kuha.txt", std::fstream::app);
        if ( myfile )
        {
            myfile << sstr << '\n'; std::cout << "файл записан " << '\n';
            system("pause");
        }
        else
        {
            std::cout << "ошибка записи файла " << '\n';
            system("pause");
        }
    }
    while ( !myfile );
    myfile.close();
    std::cout << "выход из цикла записи файла " << '\n';
    system("pause");

    return 0;
}


Если запустить сразу два экземпляра, то второй ошибку открытия файла не выдает. А
ведь должен?
    


Ответы

Ответ 1



Файлы через std::fstream открываются в режиме общего доступа. Иными словами, любой другой процесс может открыть тот же самый файл как для чтения, так и для записи. Чтобы запретить другим процессам обращаться к файлу, необходимо открывать его в режиме монопольного доступа, т.е. заблокировать. Linux Можно использовать функцию flock. Она блокирует доступ к файлу по его дескриптору. Но получить дескриптор файла для потока стандартными средствами нельзя, поэтому придётся для ввода-вывода использовать системные функции read и write. Пример использования: int fd = open("FILE_NAME", O_RDWR| O_CREAT); flock(fd, LOCK_EX); char buffer[100]; read(fd, buffer, 100); write(fd, buffer, 100); flock(fd, LOCK_UN); close(fd); Windows Можно использовать функцию WinAPI CreateFile, передав в третьем аргументе (dwShareMode) режим совместного доступа. Например, указав 0, вы откроете файл монопольно, никто другой даже на чтение открыть его не сможет. Но тогда и для всех остальных операций придётся использовать WinAPI: ReadFile, WriteFile, CloseHandle и т.д. Пример использования: HANDLE hFile = CreateFile("FILE_NAME", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); char buffer[100]; DWORD numberOfBytesRead, numberOfBytesWritten; ReadFile(hFile, buffer, 100, &numberOfBytesRead, NULL); WriteFile(hFile, buffer, 100, &numberOfBytesWritten, NULL); CloseHandle(hFile); Microsoft Visual C++ Существует ещё один метод, но он непереносим даже в пределах одной платформы и является зависимым от компилятора. Microsoft Visual C++ предоставляет перегруженный вариант функции std::fstream::open, имеющий дополнительный аргумент, задающий режим совместного владения для файла. Пример использования: std::fstream file; file.open("FILE_NAME", std::fstream::app, _SH_DENYRW); // ...

Ответ 2



fstream не блокирует файл для открытия другими приложениями. Для этого вам нужно воспользоваться функциями ОС (для Windows — CreateFile(), правда тогда для чтения и записи также придется пользоваться системными функциями), или, так как вы используете MSVC, можно передать функции std::fstream::open (ну или конструктору fstream) третий аргумент, который определяет режим доступа к файлу другими процессами, например, если вы хотите запретить доступ всем иным процессам к файлу, это будет выглядеть так: #include #include std::fstream myfile("Kuha.txt", std::fstream::app, _SH_DENYRW);

Комментариев нет:

Отправить комментарий