#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);
Комментариев нет:
Отправить комментарий