Не удается открыть для записи visual studio

Обновлено: 07.07.2024

БлогNot. Лекции по C/C++: работа с файлами (stdio.h)

Лекции по C/C++: работа с файлами (stdio.h)

В лекции рассмотрен классический способ работы с файлами в C/C++, основанный на библиотеке stdio.h (она же cstdio ) и доступе к данным через структуру FILE . Альтернативный современный механизм работы с файлами в языке C++ на основе потоков и библиотек <fstream> , <ifstream> , <ofstream> будет изучен в следующей лекции.

Базовые функции для работы с файлами описаны в библиотеке stdio.h . Вся работа с файлом выполняется через файловую переменную - указатель на структуру типа FILE , определённую в стандартной библиотеке:

Открыть файл можно функцией fopen , имеющей 2 параметра:

Параметр имя_файла может содержать относительный или абсолютный путь к открываемому файлу:

1) "data.txt" - открывается файл data.txt из текущей папки

Важно: при запуске exe-файла "текущая папка" – та, где он находится; при отладке в IDE папка может быть иной, например, в Visual Studio при открытом консольном решении с именем Console файл следует разместить в папке Console/Console , а при запуске исполняемого файла не из IDE – в папке Console/Debug .

2) "f:\\my.dat" - открывается файл my.dat из головной папки диска f:

3) имя файла запрашивается у пользователя:

Параметр режим_доступа определяет, какие действия будут разрешены с открываемым файлом, примеры его возможных значений:

1) "rt" - открываем для чтения текстовый файл;

2) "r+b" - открываем для произвольного доступа (чтение и запись) бинарный файл;

3) "at" – открываем текстовый файл для добавления данных в конец файла;

4) "w" - открываем файл для записи без указания того, текстовый он или бинарный.

Фактически, указание "r" или "t" не накладывает каких-либо ограничений на методы, которые мы будем применять для чтения или записи данных.

После открытия файла следует обязательно проверить, удалась ли эта операция. Для этого есть 2 основных подхода:

1) стандартный обработчик ferror (см. пособиe, п.8.7);

2) сравнить указатель, который вернула fopen , с константой NULL ( nullptr ) из стандартной библиотеки:

Пример. Приложение проверяет, удалось ли открыть файл из текущей папки, имя файла запрашивается у пользователя (Visual Studio)

Важно! Функции, возвращающие указатель, в том числе, fopen , считаются небезопасными в ряде новых компиляторов, например, Visual Studio 2015. Если их использование приводит не просто к предупреждению, а к генерации ошибок, есть 2 основных способа решения проблемы:

1) в соответствии с рекомендациями компилятора, заменить старые названия функций на их безопасные версии, например, strcpy на strcpy_s и fopen на fopen_s . При этом может измениться и способ вызова функций, например,

Если используется предкомпиляция, то можно определить этот макрос в заголовочном файле stdafx.h .

Выбор способа чтения или записи данных зависит от того, какой должна быть структура файла.

  • fscanf - для чтения
  • fprintf - для записи

Первым параметром этих функций указывается файловая переменная, в остальном работа совпадает со стандартными scanf и printf .

Пример. Файл text.txt в текущей папке приложения имеет следующий вид:

Прочитаем его как последовательность вещественных чисел.

1. Функции семейства scanf возвращают целое число - количество значений, которые успешно прочитаны в соответствии с указанным форматом. В реальных приложениях эту величину следует проверять в коде:

2. На "восприятие" программой данных может влиять установленная в приложении локаль. Например, если до показанного кода выполнен оператор результат работы кода может измениться (для русской локали разделителем целой и дробной части числа является запятая, а не точка).

3. Очередное чтение данных изменяет внутренний файловый указатель. Этот указатель в любой момент времени, пока файл открыт, показывает на следующее значение, которое будет прочитано. Благодаря этому наш код с "бесконечным" while не зациклился.

4. Код показывает, как читать из файла заранее неизвестное количество значений – это позволяет сделать стандартная функция feof (проверка, достигнут ли конец файла; вернёт не 0, если прочитано всё).

5. Распространённый в примерах из Сети код вида

в ряде компиляторов может породить неточности при интерпретации данных. Например, этот код может прочитать как последнее значение завершающий перевод строки в файле, благодаря чему последнее прочитанное значение "удвоится".

В качестве примера форматной записи в файл сохраним массив a из 10 целочисленных значений в файле с именем result.txt по 5 элементов в строке:

Важно! Ввод/вывод функциями библиотеки stdio.h буферизован, то есть, данные "пропускаются" через область памяти заданного размера, обмен данными происходит не отдельными байтами, а "порциями". Поэтому перед чтением данных желательно очищать буфер от возможных "остатков" предыдущего чтения методом fflush , а после записи данных следует обязательно закрывать файл методом fclose , иначе данные могут быть потеряны. Заметим, что консольный ввод/вывод "обычными" методами scanf и printf также буферизован.

  • fgetc и fputc - для посимвольного чтения и посимвольной записи данных;
  • fgets и fputs - для чтения и записи строк с указанным максимальным размером.

Как и в случае с функциями для чтения форматированных данных, у всех этих методов имеются аналоги для работы со стандартным вводом/выводом.

Пример. Читая файл, определить длину каждой строки в символах. Для решения задачи воспользуемся тем фактом, что строки завершаются символом "перевод строки" ( '\n' ). Предполагается, что файл уже открыт для чтения.

Важно! Из-за особенностей реализации fgetc , без последней проверки за телом цикла код мог "не обратить внимания", например, на последнюю строку файла, состоящую только из пробелов и не завершающуюся переводом строки.

Пример. Читаем построчно файл с известной максимальной длиной строки. Предполагается, что файл уже открыт для чтения.

Важно! Без дополнительной обработки прочитанные из файла строки при выводе будут содержать лишние пустые строки между строками данных. Это происходит потому, что функция fgets читает строку файла вместе с символом перевода строки (точней, под Windows - с парой символов \r\n , интерпретируемых как один), а puts добавляет к выводимой строке ещё один перевод строки.

  • void *buffer - нетипизированный указатель на место хранения данных;
  • size_t (unsigned) size - размер элемента данных в байтах.
  • size_t count - максимальное количество элементов, которые требуется прочитать (записать);
  • FILE *stream - указатель на структуру FILE

Пример. Целочисленный массив a запишем в двоичный файл.

Учитывая, что данные массива хранятся в последовательно идущих адресах памяти, цикл for для записи мы могли заменить одним оператором:

Подход к чтению данных с помощью fread аналогичен. Например, если файл уже открыт для чтения в режиме "rb":

  • функции fgetpos и ftell позволяют выполнить чтение текущей позиции указателя в файле;
  • функции fseek и fsetpos позволяют осуществить переход к нужной позиции в файле.

Пример. Определить размер файла в байтах, предположим, что файл уже открыт в режиме чтения или произвольного доступа.

Материал для чтения из пособия: пп. 8.6-8.11. Обратите внимание на таблицы с описанными прототипами функций ввода/вывода.

Рекомендуемые задачи: базовое задание включает две задачи, первая из которых предполагает обработку файла как текстовых данных, вторая – как бинарных. В качестве дополнительной третьей задачи может быть предложена реализация одной из задач 1, 2, содержащая консольный интерфейс и меню.

Иногда выскакивает такая магическая ошибка и очень мешает работать.

Хм. Самое очевидное, приложение все еще может работать на момент пересборки.

me, да нет, не работает оно..

Laynos
> да нет, не работает оно..

Какой то процесс остался висеть.

Тут обычно два варианта - либо он сам отвалится через несколько секунд/минут.
Либо открывайте планировщик задач и грохайте вручную.

Kartonagnick
> Какой то процесс остался висеть.
>
> Тут обычно два варианта - либо он сам отвалится через несколько секунд/минут.
> Либо открывайте планировщик задач и грохайте вручную.
А можно как-то VS заставить автоматически его грохать?
Просто очень неудобно работать.

Laynos
Если он остается висеть после закрывания окна, скорее всего это твой многопоточный говнокод виноват.

-Eugene-
о да. Он такой, мой код. Каждый человек, увидевший его, быстро убегает со слезами и годами не выходит из дому. Бойтесь мой говнокод - он нелогичен, поэтому и страшен.

Laynos
Так я угадал, что ты пытаешься что-то делать с потоками?
Мне думается, ты забываешь корректно убить другие потоки. Или корректно завершить 3rdparty-код, который умеет в многопотчность.

-Eugene-
как вариант, он мог просто прибить окно, а mainLoop продолжает крутить )

-Eugene-
ага.
MaxImuS
-Eugene-
скорее всего вы правы. За собой надобно почистить ресурсы и удалить потоки

Хотя у меня такое было даже в одном главном потоке. Когда запускал пример SFML.

MaxImuS
Мне помнится он тут недавно о потоках темы создавал.
А теперь у него характерная для незавершенных потоков проблема.
Хмм, я думаю, где-то здесь есть связь.

-Eugene-
проблема людей, не поняв как работает апп в один, хотя бы, поток, кидаются в многопоточность, так как кто-то сказал, что это круто

Laynos
открой диспетчер задачь и просто посмотри в него, после того, как закрываешь приложение остается оно висеть в процессах или нет

>А можно как-то VS заставить автоматически его грохать?
Можно на prebuild шаг повесить утилитку, которая будет убивать нужный процесс.

ilusha_nil
я думаю, нестоит издеваться над собой, а просто понимать то, что пишешь в коде

Компоновщик не может произвести запись в filename . Файл используется или его дескриптор заблокирован другим процессом либо у вас нет разрешения на запись для этого файла, каталога или сетевой папки, в которой находится файл. эта ошибка часто вызывается временным условием, например блокировкой, удерживаемой антивирусной программой, процессом индексирования поиска файлов или задержкой освобождения блокировки, удерживаемой системой сборки Visual Studio.

Чтобы устранить эту проблему, убедитесь, что дескриптор файла filename не заблокирован и у вас есть разрешение на запись в данный файл. Если это исполняемый файл, убедитесь, что он не запущен на исполнение.

вы можете использовать служебные программы Windows SysInternals или обозреватель процессов , чтобы определить, на каком процессе выполняется блокировка файла filename . С помощью программы Process Explorer можно также снимать блокировку дескрипторов открытых файлов. Сведения об использовании этих программ см. в поставляемых с ними файлах справки.

Если файл заблокирован антивирусной программой, для устранения проблемы исключите выходные каталоги сборки из автоматической проверки антивирусной программой. Программы проверки на вирусы часто запускаются при создании в системе новых файлов и блокируют эти файлы на время проверки. Сведения о порядке отключения проверки определенных каталогов см. в документации антивирусной программы.

Если файл заблокирован службой индексирования поиска, для устранения этой проблемы отключите автоматическое индексирование выходных каталогов сборки. Дополнительные сведения см. в документации службы индексирования. чтобы изменить службу индексирования поиска Windows, используйте параметры индексирования на панели управления Windows. дополнительные сведения см. в разделе индексирование поиска в Windows 10: часто задаваемые вопросы.

Если процесс сборки не может перезаписать исполняемый файл, возможно, он заблокирован программой Проводник. Если служба взаимодействия с приложением была отключена, проводник может удерживать блокировку исполняемого файла в течение длительного времени. Чтобы устранить эту проблему, запустите Services. msc и откройте диалоговое окно " свойства " для службы " взаимодействие приложений ". Измените Тип запуска с " отключено " на " вручную".

Microsoft Logo

Gray Pipe

Приносим извинения. Запрошенное содержимое было удалено. Вы будете автоматически перенаправлены через 1 секунду.

Лучший отвечающий

Вопрос

Подскажите пожалуйста. Пишу исходник в Microsoft Visual C++ 2008 Express Edition. Компилирую - все нормально, работает. вношу какие либо изменения в коде и пытаюсь заново скомпилировать. Выдает вот такую ошибку.

1>------ Построение начато: проект: 5_stepen', Конфигурация: Debug Win32 ------
1>Компиляция.
1>stepen'.cpp
1>Компоновка.
1>LINK : fatal error LNK1168: не удается открыть C:\Users\Anton\Documents\Visual Studio 2008\Projects\5_stepen'\Debug\5_stepen'.exe для записи
1>Журнал построения был сохранен в "file://c:\Users\Anton\Documents\Visual Studio 2008\Projects\5_stepen'\5_stepen'\Debug\BuildLog.htm"
1>5_stepen' - ошибок 1, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Для устранения приходится сохранить мой.cpp и закрыть прогу. через 2 минуты отрывать. тогда запускается компиляция. Ни чего не могу поделать.

Ответы

Такое происходит, когда Ваш файл 5_stepen.exe не доступен для записи. В ОС WinNT это ситуация возникает, когда файл залочен. Причиной может служить следующее: Вы скомпилировали проект и запустили полученный код. Вносите изменения, компилируете, но запись в файл .exe линковщиком не может быть выполнена, т.к. программа продолжает выполняться, т.е. она продолжает висеть в памяти. Для решения проблемы необходимо просто остановить выполнение Вашей программы 5_stepen.exe.

Все ответы

Такое происходит, когда Ваш файл 5_stepen.exe не доступен для записи. В ОС WinNT это ситуация возникает, когда файл залочен. Причиной может служить следующее: Вы скомпилировали проект и запустили полученный код. Вносите изменения, компилируете, но запись в файл .exe линковщиком не может быть выполнена, т.к. программа продолжает выполняться, т.е. она продолжает висеть в памяти. Для решения проблемы необходимо просто остановить выполнение Вашей программы 5_stepen.exe.

Не подскажите, как избавиться от косяка (или хотя бы "убить" процесс без перезагрузки). Заранее спасибо.

Мой адрес электронной почты изменился, и теперь я не могу войти в Visual Studio 2017.

Ошибка: "Мы не смогли обновить учетные данные для учетной записи. Не удалось обновить токен доступа".

введите описание изображения здесь

ОТВЕТЫ

Ответ 1

Эта ошибка будет исправлена ​​в будущей версии.

изменение имени идентификатора службы идентификации

  • Закрыть VS2017
  • Перейдите в раздел "C:\Users\\AppData\Local \.IdentityService"
  • Переименуйте "IdentityServiceAdalCache.cache", как показано ниже. (например, просто добавьте символ подчеркивания)
  • Перезагрузите VS2017 и войдите в систему.

ПРИМЕЧАНИЕ. Есть аналогичные проблемы, которые не будут устранены, но это сработало для меня.

Ответ 2

Это приведет вас к экрану входа. Если вы войдете оттуда, он войдет в Visual Studio.

Ответ 3

Для меня работала переименовать .identityservice, а затем перезапустить VS и войти в свою учетную запись VSTS. Затем он воссоздает новый. Identityservice, к которому он может получить доступ.

Ответ 4

Ответ 5

Я попытался удалить только IdentityServiceAdalCache.cache, как в принятом ответе, но это не решило проблему.

Ответ 6

Это также может быть вызвано сетевыми ограничениями. Пожалуйста, отключите антивирусную защиту или брандмауэр и проверьте.

Ответ 7

Я нашел такое же поведение при использовании пользователя Administrator. Любой другой пользователь может войти в систему и активировать лицензию только для себя. Я не думаю, что есть способ активировать для администратора, что делает использование этого лицензирования неудобным для использования в общем ресурсе (т.е. Сервере сборки).

Ответ 8

Если ваша сеть блокирует это (возможно, чтобы заблокировать веб-почту Microsoft), то вышеупомянутые решения не будут относиться к вам. Либо неограниченный доступ, либо вам понадобится какая-то офф-версия.

Ответ 9

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

Ответ 10

В случае, если кто-то все еще ищет ответ. Для меня работало, что папка AppData и Локальная папка не находились в "режиме только для чтения" по пути "C:\Users \AppData\Local.IdentityService", и это просто работало!

Ответ 11

Я обновил Visual Studio до последней версии, и после перезагрузки проблема с ПК была решена. Я смог войти

Ответ 12

  • Убедитесь, что у вашего ПК нет ограничений (IP-брандмауэр) для доступа к интернет-соединению.
  • Отключить или отключить VPN

Ответ 13

Открытие VS в качестве администратора работал у меня, ничего из вышеперечисленного не сделал

Читайте также: