#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);