Dev-C ++ не записывает выходной файл на диск

Когда я запускаю свою программу на Linux в uni, программа работает нормально. Создается файл fred.out . Но когда я запускаю его дома на Dev-C ++, он не записывает выходной файл.

Как мне это исправить? Я уже пару часов ищу и пытаюсь. Я пробовал включать несколько библиотек. Может ли это быть проблемой безопасности?

Вот мой код:

  #include  int main (void) {FILE *  fp_1;  плавающий мат [3] [3] = {{1,2,3}, {4,5,6}, {7,8,9}};  int i, j;  fp_1 = fopen ("fred.out", "w");  for (j = 0; j  

EDIT:


1

Всегда проверяйте успешное выполнение fopen () перед использованием возвращенного указателя. В противном случае, если fopen () не удается открыть файл, использование возвращенного FILE * в дальнейшем будет неопределенным.

Кроме того, после сбоя fopen () вы можете проверить errno , чтобы определить причину сбоя.

Улучшить этот ответ
отредактировано 27 мая 2015 года в 10:58
ответил 27 мая 2015, в 10:19
  • Спасибо! Я добавил эту проверку fopen (), но она не удалась. Что я должен делать? — Thomas M 27 мая 2015, 14:06
  • @ThomasM Я сказал … проверьте errno на предмет причины сбоя. — Сурав Гош, 27 мая 2015, в 14:07
  • как проверить ошибку? — Thomas M 27 мая 2015, 14:20
добавить комментарий |

Всегда проверяйте успешность fopen () перед использованием возвращенного указателя. В противном случае, если fopen () не удается открыть файл, использование возвращенного FILE * в дальнейшем будет неопределенным.

Кроме того, после сбоя fopen () вы можете проверить errno , чтобы определить причину сбоя.


0

В Windows и mingw вам может потребоваться открыть файл в двоичном режиме, добавление «b» в режим fopen:

  fp_1 = fopen ("fred. out "," wb ");  

Edit2: как Дегустаф сказал в комментариях, вы можете использовать char * strerror (int errnum) , включая errno.h и string.h, чтобы узнать, в чем была ошибка:

  #include  #include  #include   int main (void) {FILE * fp_1; float mat [3] [3] = {{1,2,3}, {4,5,6}, {7,8,9}}; int i, j;  fp_1 = fopen ("fred.out", "w"); if (fp_1 == NULL) {printf (" n% s", strerror (errno)); return 1;} for (j = 0; j  

Изменить: вы можете проверить errno следующим образом, включая errno.h и проверку переменной с именем «errno «. В следующем примере есть некоторые ошибки, не указанные в списке, потому что fopen может установить errno на те же ошибки, что и malloc, см. Справочные страницы fopen, open и malloc для получения дополнительных сведений:

  #include  #include  void func_errno () {switch (errno) {case EACCES: printf (" nEACCES"); break;  case EEXIST: printf (" nEEXIST");  сломать;  case EFAULT: printf (" nEFAULT");  сломать;  case EFBIG: printf (" nEFBIG");  сломать;  case EINTR: printf (" nEINTR");  сломать;  case EISDIR: printf (" nEISDIR");  сломать;  case ELOOP: printf (" nELOOP");  сломать;  case EMFILE: printf (" nEMFILE");  сломать;  case ENAMETOOLONG: printf (" nENAMETOOLONG");  сломать;  case ENFILE: printf (" nENFILE");  сломать;  case ENODEV: printf (" nENODEV");  сломать;  case ENOENT: printf (" nENOENT");  сломать;  case ENOMEM: printf (" nENOMEM");  сломать;  case ENOSPC: printf (" nENOSPC");  сломать;  case ENOTDIR: printf (" nENOTDIR");  сломать;  case ENXIO: printf (" nENXIO");  сломать;  case EOVERFLOW: printf (" nEOVERFLOW");  сломать;  case EPERM: printf (" nEPERM");  сломать;  case EROFS: printf (" nEROFS");  сломать;  case EWOULDBLOCK: printf (" nEWOULDBLOCK");  сломать;  по умолчанию: printf (" nДругая ошибка.");  сломать;  }} int main (void) {ФАЙЛ * fp_1;  плавающий мат [3] [3] = {{1,2,3}, {4,5,6}, {7,8,9}};  int i, j;  fp_1 = fopen ("fred.out", "w");  если (fp_1 == NULL) {func_errno ();  возврат 1;  } for (j = 0; j  

Улучшить этот ответ
отредактировано 27 мая 2015, 17:43
ответил 27 мая 2015, 10:30
  • замена «wb» на «w» не изменила результата, хотя и благодарю за вашу помощь =) — Thomas M 27 мая 2015 г., 13:59
  • func_errno — это плохая повторная реализация уже доступной функции strerror. — Дегустаф, 27 мая 2015 г., 15:40
добавить комментарий |

В Windows и mingw вы можете нужно открыть файл в двоичном режиме, добавив букву «b» в режим fopen:

  fp_1 = fopen ("fred.out", "wb");  

Edit2: Как сказал Дегустаф в комментариях, вы можете использовать char * strerror (int errnum) , включая errno.h и string.h, чтобы знать в чем была ошибка:

  #include  #include  #include  int main (void) {FILE * fp_1;  плавающий мат [3] [3] = {{1,2,3}, {4,5,6}, {7,8,9}};  int i, j;  fp_1 = fopen ("fred.out", "w");  если (fp_1 == NULL) {printf (" n% s", strerror (errno));  возврат 1;  } for (j = 0; j  

Изменить: вы можете проверить errno следующим способом, включая errno.h и проверку переменной с именем «errno». В следующем примере есть некоторые ошибки, не указанные в списке, поскольку fopen может устанавливать в errno те же ошибки, что и malloc, см. Справочные страницы fopen, open и malloc для получения дополнительных сведений:

  #include  #include  void func_errno () {переключатель (ошибка) {case EACCES: printf (" nEACCES");  сломать;  case EEXIST: printf (" nEEXIST");  сломать;  case EFAULT: printf (" nEFAULT");  сломать;  case EFBIG: printf (" nEFBIG");  сломать;  case EINTR: printf (" nEINTR");  сломать;  case EISDIR: printf (" nEISDIR");  сломать;  case ELOOP: printf (" nELOOP");  сломать;  case EMFILE: printf (" nEMFILE");  сломать;  case ENAMETOOLONG: printf (" nENAMETOOLONG");  сломать;  case ENFILE: printf (" nENFILE");  сломать;  case ENODEV: printf (" nENODEV");  сломать;  case ENOENT: printf (" nENOENT");  сломать;  case ENOMEM: printf (" nENOMEM");  сломать;  case ENOSPC: printf (" nENOSPC");  сломать;  case ENOTDIR: printf (" nENOTDIR");  сломать;  case ENXIO: printf (" nENXIO");  сломать;  case EOVERFLOW: printf (" nEOVERFLOW");  сломать;  case EPERM: printf (" nEPERM");  сломать;  case EROFS: printf (" nEROFS");  сломать;  case EWOULDBLOCK: printf (" nEWOULDBLOCK");  сломать;  по умолчанию: printf (" nДругая ошибка.");  сломать;  }} int main (void) {ФАЙЛ * fp_1;  плавающий мат [3] [3] = {{1,2,3}, {4,5,6}, {7,8,9}};  int i, j;  fp_1 = fopen ("fred.out", "w");  если (fp_1 == NULL) {func_errno ();  возврат 1;  } for (j = 0; j  

0

Я не уверен, что случилось, но я скопировал свои файлы с флэш-диска на жесткий диск, и у меня не было проблем с записью файлов. Спасибо за все ваши ответы, ребята!

Улучшите этот ответ
ответил 29 мая ’15 в 1:28
добавить комментарий |

Я не уверен, что случилось, но я скопировал свои файлы с большого пальца на жесткий диск, и у меня не было проблем запись файлов. Спасибо за все ваши ответы, ребята!



Java — Запись в файл

1. Обзор

В этом руководстве мы рассмотрим различные способы записи в файл с помощью Java. Мы будем использовать BufferedWriter , PrintWriter , FileOutputStream , DataOutputStream , RandomAccessFile , FileChannel, и служебный класс Java 7 Files .

Мы ‘ Я также рассмотрю блокировку файла во время записи и обсудим некоторые заключительные выводы по записи в файл.

Это руководство является частью серии Java «Назад к основам». здесь, на Baeldung.

Дополнительная литература:

Java — Добавить данные в Файл

Краткое практическое руководство по добавлению данных в файлы.
Подробнее →

FileNotFoundException в Java

Краткое практическое руководство по FileNotFoundException в Java.
Подробнее →

Как скопировать файл с помощью Java

Ознакомьтесь с некоторыми распространенными способами копирования файлов в Java.
Подробнее →

2. Пишите с помощью BufferedWriter

Давайте начнем с простого и воспользуемся BufferedWriter для записи String в новый файл :

  public void whenWriteStringUsingBufferedWritter_thenCorrect () выбрасывает IOException {String str  = "Привет";  BufferedWriter writer = новый BufferedWriter (новый FileWriter (имя_файла));  писатель.write (str);  Writer.close ();}  

Результатом в файле будет:

  Hello  

Затем мы можем добавить String к существующему файлу :

  @  Testpublic void whenAppendStringUsingBufferedWritter_thenOldContentShouldExistToo () выбрасывает IOException {String str = "World";  BufferedWriter writer = новый BufferedWriter (новый FileWriter (имя_файла, истина));  писатель.append ('');  Writer.append (стр.);  Writer.close ();}  

Тогда файл будет выглядеть следующим образом:

  Hello World  

3. Пишите с помощью PrintWriter

Теперь давайте посмотрим, как мы можем использовать PrintWriter , чтобы записать форматированный текст в файл. ; PrintWriter printWriter = новый PrintWriter (fileWriter); printWriter.print («Некоторая строка»); printWriter.printf («Название продукта% s, его цена% d $», «iPhone», 1000); printWriter.close ();}

Полученный файл будет содержать:

  Некоторое имя StringProduct - iPhone, а его цена - 1000  $  

Обратите внимание, что мы не только записываем в файл необработанную String , но также и некоторый форматированный текст с помощью printf .

Мы можем создать писатель, используя FileWriter , BufferedWriter или даже System.out .

4. Запись с помощью FileOutputStream

Давайте теперь посмотрим, как мы можем использовать FileOutputStream для записи двоичных данных в файл.

Следующий код преобразует String в байты и записывает байты в файл с помощью FileOutputStream :

  @Testpublic void givenWritingStringToFile_whenUsingFileOutputStream_thenCorrect () выдает исключение IOException {String str = "Hello";  FileOutputStream outputStream = новый FileOutputStream (имя_файла);  byte [] strToBytes = str.getBytes ();  outputStream.write (strToBytes);  outputStream.close ();}  

Результатом в файле, конечно же, будет:

  Hello  

5. Пишите с помощью DataOutputStream

Затем давайте посмотрим, как мы можем использовать DataOutputStream для записи String в файл:

  @Testpublic void givenWritingToFile_whenUsingDataOutputStream_thenCorrect () выбрасывает IOException {String value = "Hello  ";  FileOutputStream fos = новый FileOutputStream (имя_файла);  DataOutputStream outStream = новый DataOutputStream (новый BufferedOutputStream (fos));  outStream.writeUTF (значение);  outStream.close (); //проверка результатов String result;  FileInputStream fis = новый FileInputStream (имя_файла);  Читатель DataInputStream = новый DataInputStream (fis);  результат = reader.readUTF ();  reader.close ();  assertEquals (значение, результат);}  

6. Запись с помощью RandomAccessFile

Давайте теперь проиллюстрируем, как писать и редактировать внутри существующего file , а не просто записывать в совершенно новый файл или добавлять к существующему. Проще говоря: нам нужен произвольный доступ.

RandomAccessFile позволяет нам писать в определенной позиции в файле с учетом смещения — от начала файла — в байтов.

Этот код записывает целочисленное значение со смещением, заданным от начала файла:

   private void writeToPosition (String filename, int data, long position) выбрасывает IOException {RandomAccessFile writer = new RandomAccessFile (filename, "rw");  writer.seek (должность);  Writer.writeInt (данные);  Writer.close ();}  

Если мы хотим прочитать int , хранящийся в определенном месте , мы можем использовать этот метод:

  private int readFromPosition (String filename, long position) выбрасывает IOException {int result = 0;  Читатель RandomAccessFile = новый RandomAccessFile (имя файла, "r");  reader.seek (позиция);  результат = reader.readInt ();  reader.close ();  return result;}  

Чтобы проверить наши функции, давайте напишем целое число, отредактируем его и, наконец, прочитаем его обратно:

   @Testpublic void whenWritingToSpecificPositionInFile_thenCorrect () выдает исключение IOException {int data1 = 2014;  int data2 = 1500;  writeToPosition (имя_файла, данные1, 4);  assertEquals (данные1, readFromPosition (имя_файла, 4));  writeToPosition (имя_файла2, данные2, 4);  assertEquals (data2, readFromPosition (fileName, 4));}  

7. Пишите с помощью FileChannel

Если мы имеем дело с большими файлами, FileChannel может быть быстрее, чем стандартный ввод-вывод. Следующий код записывает String в файл с помощью FileChannel :

  @Testpublic void givenWritingToFile_whenUsingFileChannel_thenCorrect () выбрасывает IOException {поток RandomAccessFile = new RandomAccessFile (fileName, "rw");  FileChannel канал = stream.getChannel ();  Строковое значение = "Привет";  byte [] strBytes = значение.getBytes ();  ByteBuffer buffer = ByteBuffer.allocate (strBytes.length);  buffer.put (strBytes);  buffer.flip ();  channel.write (буфер);  stream.close ();  channel.close (); //проверяем RandomAccessFile reader = new RandomAccessFile (fileName, "r");  assertEquals (значение, reader.readLine ());  reader.close ();}  

8. Запись с помощью файлов класса

Java 7 представляет новый способ работы с файловой системой, а также новый служебный класс: Files .

Используя класс Files , мы можем создавать, перемещать, копировать и удалять файлы и каталоги. Его также можно использовать для чтения и записи в файл:

  @Testpublic void givenUsingJava7_whenWritingToFile_thenCorrect () выбрасывает IOException {String str = "Hello";  Путь path = Paths.get (fileName);  byte [] strToBytes = str.getBytes ();  Files.write (путь, strToBytes);  String read = Files.readAllLines (путь) .get (0);  assertEquals (str, read);}  

9. Запись во временный файл

Теперь давайте попробуем записать во временный файл. Следующий код создает временный файл и записывает в него String :

  @Testpublic void whenWriteToTmpFile_thenCorrect () выбрасывает IOException {String toWrite = "  Здравствуйте";  Файл tmpFile = File.createTempFile («тест», «.tmp»);  FileWriter writer = новый FileWriter (tmpFile);  писатель.write (писать);  писатель.close ();  Читатель BufferedReader = новый BufferedReader (новый FileReader (tmpFile));  assertEquals (toWrite, reader.readLine ());  reader.close ();}  

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

10. Заблокировать файл перед записью

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

Давайте воспользуемся FileChannel , чтобы попытаться заблокировать файл перед записью в него:

  @Testpublic void whenTryToLockFile_thenItShouldBeLocked () выдает исключение IOException {поток RandomAccessFile = новый RandomAccessFile (fileName, "rw");  FileChannel канал = stream.getChannel ();  FileLock lock = null;  попробуйте {lock = channel.tryLock ();  } catch (последнее исключение OverlappingFileLockException e) {поток. Закрыть();  channel.close ();  } stream.writeChars ("тестовая блокировка");  lock.release ();  stream.close ();  channel.close ();}  

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

11. Примечания

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

  • Если мы попытаемся прочитать из файла, который не существует, будет выброшено исключение FileNotFoundException .
  • Если мы попытаемся записать в файл которого не существует, файл будет создан первым, и исключение не возникнет.
  • Очень важно закрыть поток после его использования, поскольку он не закрывается неявно, чтобы освободить любой связанные с ним ресурсы.
  • В потоке вывода метод close () вызывает flush () перед освобождением ресурсов, который заставляет любые буферизованные байты записываться в поток.

Рассматривая общие практики использования, мы можем видеть, например, что PrintWriter используется для записи форматированного текста, FileOutputStream для записи двоичных данных, DataOutputStream для записи примитивных типов данных, RandomAccessFile для записи в конкретную позицию ion и FileChannel , чтобы быстрее писать в файлы большего размера. Некоторые API этих классов позволяют больше, но это хорошее место для начала.

12. Заключение

В этой статье проиллюстрированы многие варианты записи данных в файл с помощью Java.

Реализацию всех этих примеров и фрагментов кода можно найти на GitHub.

Java bottom

Я только что анонсировал новый курс Learn Spring , посвященный основам Spring 5 и Spring Boot 2:

>> ПРОВЕРИТЬ КУРС

Оцените статью
logicle.ru
Добавить комментарий