Fstream не создает файл
Доброе время суток. Два дня бъюсь и не могу понять в чём проблема. Надо создать файл ну и работать с ним, Но при создания файла возникает ошибка. Вот код:
int _tmain(int argc, _TCHAR* argv[])
FILE *fp;
fp = fopen("input.txt", "w");
warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : see declaration of 'fopen'
Перепробовал варианты из интернета и видео - не каких результатов. В чём ошибка?
файл input.txt создался.
То, что компилятор Visual Studio выдает warning, это не ошибка. Это просто означает, что создатели Visual Studio считают функцию fopen() небезопасной и рекомендуют вместо нее пользоваться другой функцией, fopen_s(). Вы совсем не обязаны следовать их рекомендациям. MinGW функцию fopen() не считает опасной (уязвимой для взломщиков) и никаких предупреждений не выдает.
А файл input.txt поищите поиском по диску, может он и создался, только в другом месте, не там, где Вы его ищете. Может быть, конечно, и так, что Visual Studio файл создает только после того, как в него записано какое-то содержимое, так что пустой файл не создается, но это маловероятно.
Matematic - Спасибо огромно. Файл и правда создавался, но не там где я его ждал. Извеняюсь за токую невнимартельность, но лучше задать странный вопрос, чем самому неделями сидеть и тупить
Matematic - Спасибо огромно. Файл и правда создавался, но не там где я его ждал. Извеняюсь за токую невнимартельность, но лучше задать странный вопрос, чем самому неделями сидеть и тупить
Да не за что. Программа при запуске имеет домашний каталог (домашнюю директорию). В Unix/Linux этот домашний каталог определяется особой переменной окружения, в Винде я не знаю, чем он определяется, но возможно, что точно так же. Зачастую им (домашним каталогом) оказывается тот же каталог, в котором расположен файл самой программы (бинарный модуль). В нем и должен был быть создан файл input.txt.
А с Visual Studio скорее всего произошло вот что. VS компилирует исходник только при условии, что для него был создан проект, т. е. для вашего исходника был создан некий проект. Насколько помню, VS (да и любая другая IDE в принципе) помещает откомпилированные бинарники совсем в другой каталог, нежели исходники. Т. е. фалы с исходными текстами хранятся в своем каталоге, а для файлов бинарников, генерирующихся при компиляции, создается свой собственный каталог, туда они и сбрасываются. При запуске программы (Run, скорее всего) бинарник запускался из той самой папки, где VS держит бинарные файлы проекта. В той же папке с бинарниками, скорее всего, создавался и файл input.txt. Вы же его пробовали найти в папке с исходниками, где не было бинарников, и этого файла создаться не могло.
Так все было?
Имя входного файла присваивается имени существующего файла в качестве входного аргумента для приложения. Имя выходного файла дается так же, как имя ввода, за исключением того, что «_output» вставляется до последнего периода. Таким образом, вывод записывается в тот же каталог, в котором находится вход. Также я начинаю netbeans с
таким образом, IDE имеет привилегии root для каталога. Я пытаюсь открыть файлы и проверить, открыты ли они таким образом.
Любая помощь в определении, почему выходной файл не открывается для записи, была бы очень признательна.
Решение
Очевидная проблема заключается в том, что вы, вероятно, хотели открыть файл, используя std::ofstream а не std::ifstream , Это помогает на самом деле записи в поток, хотя есть способы записи в std::ifstream до тех пор, пока он открыт для чтения. Например, вы можете использовать std::streambuf напрямую или используйте std::streambuf построить и std::ostream ,
Более интересный вопрос: почему файл не открывается для записи, когда std::ios_base::in | std::ios_base::out используется для открытого режима? std::ifstream автоматически добавляет std::ios_base::in , Оказывается, что режим std::ios_base::in | std::ios_base::out не создает файл, но он успешно открыл бы существующий файл. Если вы действительно хотите использовать std::ifstream чтобы открыть файл для вывода, который потенциально не существует, вам нужно будет использовать либо std::ios_base::out | std::ios_base::trunc или же std::ios_base::out | std::ios_base::app :
- первый вызовет создание или усечение файла, если он существует
- последнее заставит записи добавлять в файл во всех случаях
Мое личное предположение, однако, заключается в том, что вам лучше всего использовать std::ofstream или, если вы хотите открыть файл для чтения и записи std::fstream (который, однако, также должен был бы иметь std::ios_base::trunc или же std::ios_base::app добавлено для создания файла, если его нет).
Непонятно то, что если я эту программу пишу в main(), то файл создается, а если код в классе, то не создается файл. Я даже проверку сделал (строки 16 - 19), программа говорит, что создается файл. Может он создается где нибуть хрен знает где? И еще, если я например в строке 14 пишу так:
То файл создается в указанном месте, а мне нужно, чтоб он создавался с файлом программы в одном месте. Может здесь есть специфика MinGW?
Помогите новичку.
Fstream: при запуске программы в IDE, файл не создаётся; почему так происходит?
Доброго времени суток!) Может немного глупый вопрос, но самому решить не получается. Когда собираю.
fstream не создаётся txt файл
Здравствуйте Linux не создаёт автоматом txt файл. В чём проблема может быть ? std::string.
При нажатии на кнопку файл не создается на диске, а он создается только после сворачивания или закрытия окна.
Знакомлюсь с графическим интерфейсом Java Swing. Появилась такая проблема: при нажатии на кнопку.
Не создаётся exe файл. Создаётся папка netcoreapp2.0
На рабочем компе всё нормально, exe лежит в Debug. На домашнем может с настройками что намудрил.
специвльно пришлось перепроверить на чем было: связка кодеблокс+мингв.
итак.
1. при запуске из кодеблокса( среды разработки) программа считает текущей п а пкой папку проекта( там где main.cpp лежит или другой главный файл). и файлик твой создается именно там.
2. сама программа лежит в подпапке bin/release или bin/debug. если руками запустить программу отттуда, то текущей считается эта папка и твой файлик создается в ней.
Облазил я свой компьютер и нашел этот файлик в c:\Users\DruidCat\ хотя сам проект находится c:\Users\DruidCat\Documents\Eclipse++\Write\Release\.
Запускаю эту программу через командную строку с прописанным PATH, видимо из-за этого файл появляется там, где появляется.
Спасибо за помощь!
Перенос проекта из Ecipse в Android Studio
При переносе проекта из Ecipse в Android Studio появляются ошибки об отсутствии ресурсов типа.
Fstream не видит файл
Почему в Visual Studio2015 не находит текстовый файл, который лежит рядом с .exe? .
Fstream не видит файл
/del
Fstream не видит файл
Делаю лабу и возникла такая проблема - надо открыть текстовый файл. Файл лежит в одной папке c .exe.
Код моей программы:
Это основная часть программы, занимающаяся обработкой файлов. Оставшаяся часть программы занимается обработкой некоторых данных и записью их в файл, что, как мне кажется, не имеет значения и не влияет на обработку файлов.
Интересно то, что программа не выдает никаких ошибок.
Если вы запустите программу из командной строки, файл будет создан в текущем каталоге. Если вы запускаете его из IDE, то текущий каталог устанавливается в настройках проекта.
@Gaurav, нет гарантии, что iostreams настроен errno на ошибку. И файл создается в текущем рабочем каталоге, который не обязательно является каталогом, в котором находится программа (если вы запустите, /bin/ls он по умолчанию не покажет вам содержимое /bin !)
Однако есть кое-что неправильное: вы не должны записывать fflush в файл. Это функция из библиотеки C, которую вы используете как fflush(FILEstruct); . При выполнении вашего кода он просто записал в файл 1. Также не следует писать в файл безоговорочно. Сначала проверьте, можно ли открыть файл, затем, если это так, запишите в файл и закройте его только в этом случае.
@Gaurav Ну, удаление не обязательно означает удаление файлов конфигурации. В любом случае спросите свою любимую поисковую систему о путях сборки Code :: Blocks вместо того, чтобы просто переустанавливать ее, если вы хотите изменить это поведение.
Ваш код обычно работает с небольшими изменениями, файл просто создается в текущем рабочем каталоге, из которого запускается ваша программа, а не в каталоге, в котором находится исполняемый файл. Однако есть много других вещей, которые вы, возможно, захотите решить:
Для получения подробной информации о том, почему открытие файла не сработало, вы можете посмотреть std::basic_ios::bad() и std::basic_ios::fail() . Проверка errno Вы ничего не хотите делать при использовании C ++ потоков для обработки файлов.
Если файл открыт, вы можете найти его местоположение с помощью GDB и procfs . Просто поставьте точку останова там, где файл открыт, но еще не закрыт. Запустите программу в отладчике, пока не сработает точка останова. Затем используйте следующую команду:
где находится PID программа. Полный путь к файлу должен быть где-то в выводе.
Основные отличия:
Это работает в Ubuntu 14.04 (64-разрядная версия). Я скомпилировал с помощью g ++ без флагов.
Кроме того, я предлагаю вам никогда не использовать using namespace std; Это может сильно раздражать, когда вы начинаете интегрироваться с другими библиотеками, такими как Boost (библиотеки Boost могут перекрываться с функциями каждой стандартной библиотеки C ++).
Что ж, вы "исправили" проблему с пространством имен, но ваша программа так же сломана, как и исходная, в которой не было заголовка errno. Вы исправили отсутствующее включение errno, но вам не хватает
Я также рекомендую вам выполнить компиляцию -Wall -Wextra -pedantic , он скажет вам, что file
Кстати, std :: flush определен в
hello
im using dev cpp 4.9 on win xp sp3
here's the problem :
let's say i want to create a file named "h1.vhdd" in "c:\vhdd"
i tried this cod
using namespace std;
int main()
fstream t;
t.open("c:\vhdd\h1.vhdd",ios::out);
t.close();
but it does not creat the file.Itried this cod in Visual c++ 2008 but it didn't work either .
you haven't created the file. Infact you are trying to access the file in the line
t.open("c:\vhdd\h1.vhdd",ios::out);
The proper method to create the file is
fstream t("h1.vhdd");
Then you may access it with the t.open() command.
That has nothing to do with the problem.
The reason he has no file is that he didn't write anything to it. If all you want is a blank file, make sure to flush before closing:
Hope this helps.
tanks
that work fine.
2.if you want to use the "fstream" to worck with files there are some tricks
A. if you try to creat a file (that does not priviously exits) to use it for writing and reading using code like "fstream file("new_file",ios::out | ios::in) IT WON' T WORCK. .
you have to create the file only for writing fstream file("new_file",ios::out) then close the file file.close() and now you can open it again this time for what ever operation you want , for exaple file.open("new_file",ios::out | ios::in | ios::binary) now it will work.
B.if you want to creat a file (that does not priviously exists) at a cirtain location ( for example "c:\\my_folder\\new_file") again you have to create it first only for writing then close it and after that open it again whit what ever operations. BUT IT WON'T WORCK UNLES THE FOLDER "my_folder" ALLREADY EXISTS .
IF YOU WANT TO CREATE THE HOLE STRUCTURE "\\my_folder\\new_file" you have to create the folder "my_folder" first.
you ca do that using the
system() |
system("md c:\\my_folder"); |
Sorry I missed the backslashes in your strings. Yeah, you've got to double them.
You can actually open a file for both reading and writing, you just have to reset the read pointer before reading.
The simplest way to think of a file is as an array of bytes (or chars) on disk. So, when you first create a file, the file pointer is addressing the first byte in the file.
If you now want to read from the file, remember that the file pointer is still at the end of the file. You first have to reset it to the beginning of the file.
myfile.seekg( 0 );
becomes:
where c contains the value 'H'.
The only 'gotcha' that you have to remember with streams is that the read pointer and the write pointer aren't necessarily separate entities (even though they are supposed to be for C++), so if you change one then assume that the other is lost. In other words, after you read, use seekp() before you write, and after you write, use seekg() before you read.
As for folders, it is a convenience of the operating system's user interface that certain user commands allow you to create folders and files at the same time. In C++ code, you have to remember that they are actually separate actions, so you must verify or create each directory before you can create a file.
Hope this helps.
if you can creat a file directly for bouth reading and writing , why does this code returns " the file is not open" . important!! the file "test_file" does not priviously exists
using namespace std;
int main(void)
fstream file("test_file",ios::out | ios::in | ios::binary);
if(file.is_open()) cout else cout
Читайте также: