@dearname

Почему не определяет конец файла в параллельной программе?

Всем привет! Уже долго мучаюсь с задачей. Суть ее проста: 3 потока, один читает из файла в буфер, другой в буфере меняет текст, третий записывает из буфера в этот же файл. У меня почему то не отрабатывает конец файла, то есть программа все делает правильно, но потом уходит в бесконечный цикл.

// openmpfile.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <omp.h>
#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;


int main()
{
	setlocale(LC_ALL, "Russian");

	fstream file("text.txt", ios::in | ios::out);

	const int length = 10;
	int pos = 0;

	char* buffer = new char[length];

	omp_lock_t lock;
	omp_init_lock(&lock);

	bool flagBuffer = false;
	bool flagWriter = false;

#pragma omp parallel sections num_threads(3) shared(size,flagBuffer,length,flagWriter,buffer, pos, file) 
{
	#pragma omp section 
	{
		while (!file.eof())
		{
			omp_set_lock(&lock);
			if (flagBuffer == false && flagWriter == false)
			{
				file.clear();
				pos = (int)file.tellg();
				file.read(buffer, length);
				flagBuffer = true;
				file.clear();
				file.seekg(pos);
			}
			omp_unset_lock(&lock);
		}
	}

#pragma omp section 
		{
		while (!file.eof())
		{
			omp_set_lock(&lock);
			if (flagBuffer) {
				cout << "buffer" << endl;
				for (int i = 0; i < length; i++) 
				{
					buffer[i] = toupper(buffer[i]);
					cout << buffer[i] << " ";
				}
				cout << endl;
				flagBuffer = false;
				flagWriter = true;

			}
			omp_unset_lock(&lock);

			
		}
	}

#pragma omp section 
		{
		while (!file.eof())
		{
			omp_set_lock(&lock);
			
			if (flagWriter) {
				file.write(buffer, length);
				flagWriter = false;
			}
			
			omp_unset_lock(&lock);
			
		}
		
	}

	}


	file.close();

	return 0;
}
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
Проверяйте дополнительно, что read прочитал меньше, чем length - во-первых тоже признак конца файла, во-вторых, нужно учитывать при последующей записи, чтоб не расширить файл
Ответ написан
Ваш ответ на вопрос

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

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