@igoodmood

Возможна ли работа с двумя бинарными файлами одновременно в С++?

Возможна ли работа с двумя бинарными файлами одновременно в С++? Например, есть бинарный файл, в нем находятся числа в произвольном порядке : отрицательные и положительные. Может ли программа одновременно открыть уже существующий файл с данными числами и новый, в который будет производится запись чисел в нужно поочередности?
Для наглядности хочу показать фрагмент кода чтобы была понятна суть (код пока еще не рабочий,) :
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	setlocale (LC_ALL, "RUS");
	int n, i;
	double *a;
	FILE *f,*z; 
	f=fopen("D:\\steam\\noobs.dat", "rb");
	fread(&n, sizeof(int), 1, f);
	a=new double[n];
	fread(a, sizeof(double), n, f);
	z=fopen("D:\\steam\\noobs.dat", "wb");
	fwrite(&n, sizeof(int), 1, z);
	for(int i = 1; i<=n; i++)
	{
		if(a[i]<0)
		{
			cin >> a[i];
			fwrite(&a, sizeof(double), 1, z);
		}
	}
	fclose(z);
	fclose(f);
	system("pause");
	return 0;
}
  • Вопрос задан
  • 640 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Makaleks
  1. Да С++ может работать с 2 бинарными файлами. Ещё раз - файлами, а не одним файлом, открытом на чтение и запись одновременно! Как, по-вашему, читать из файла или писать в него, если он уже открыт до этого на запись? Попробую аналогию: как туристам фотографировать одну картину в застеклённом стенде, если автор забрал её, чтобы дорисовать пару штрихов? Можно одновременно читать отовсюду, но делать что-то с файлом, открытом на запись, нельзя.

    В вашем случае перед открытием на запись можно вызвать fclose(f), раз вы сохранили всё, что хотели.

  2. В С++ индексация в массивах идёт от нуля. a[i] (где i == n на последнем шаге) лежит вне массива.
    for(int i = 0; i<n; i++)

  3. Что такое cin? Так и написано: "Си-ввод (с консоли)", так же как cout: "Си-вывод". Я так понял, что вы хотели просто вывести на консоль то, что вводите. Замените cin на cout.

  4. Вообще говоря, если не считать cin, то вопрос скорее по Си, чем по С++. С++ работает с классами и методами, Си работает со структурами и функциями. Поэтому лучше задавать эти вопросы в раздел про Си.

  5. Пожалуйста, называйте переменные говорящими именами - всем будет проще. На почитать


Читайте "С++ полный справочник" (Г.Шилдт) - многие вопросы будут быстро пропадать (там и примеры есть).

int N1 = 0;
  double *array;
  FILE *file; 
  file=fopen("D:\\steam\\noobs.dat", "rb");
  fread(&N1, sizeof(int), 1, file);
  array=new double[N1];
  fread(array, sizeof(double), N1, file);
  fclose(file);
  file=fopen("D:\\steam\\noobs.dat", "wb");
  int N2 = 0;
  fwrite(&N2, sizeof(int), 1, file); // резервируем в начале файла место под N2
  for(int i = 0;  i < N1; i++)
  {
    if(array[i]<0)
    {
      printf("%lg, " array[i]);
      fwrite(&array, sizeof(double), 1, file);
      N2++;// N2 != N1 !!!
    }
  }
  fseek(file, 0, SEEK_SET);// в начало
  fwrite(&N2, sizeof(int), 1, file);// N2 != N1 !!!
  fclose(file);
  system("pause");
Ответ написан
Комментировать
Daniro_San
@Daniro_San
Программист
Не нужно использовать сишные либы вперемешку с STL.
Я говорю про fopen и cin /cout .
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы