2015-11-04 20 views
-1

У меня довольно странная проблема. Чтение поплавка из текстового файла, как обычно, тестовый файл не содержит ничего, кроме одного поплавка:Чтение текстовых файлов с использованием matlab

fid = fopen('file.txt','r'); 
a = fscanf(fid,'%f'); 
fclose(fid); 

Если я опустить fclose... линии, а затем запустить fscanf... снова, я получаю пустой массив, потому что я уже просмотрел все содержимое файла; это нормальное поведение.

Анализ, который я использую для выполнения Matlab, требует четырех параллельных процессов (которые обязательно независимы и не могут передавать данные между собой), чтобы каждый мог читать файл. Анализ занимает порядка часов, и четыре процесса вряд ли когда-либо захотят прочитать один и тот же файл за полчаса друг от друга, для одного процесса не должно быть проблем, чтобы прочитать его и закрыть его задолго до любого другого процессы пытаются его прочитать. Моя параллелизация очень проста - четыре задачи запускаются вручную из графического интерфейса Matlab.

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

EDIT: если я пишу файл, используя команду matlab fprintf..., она ведет себя отлично. Это просто файлы, напечатанные с использованием библиотеки C++ ofstream, которые, похоже, вызывают проблемы. C++ код участвует в написании файла выглядит следующим образом: (? MATLAB ошибка может быть)

#include <iostream> 
std::ofstream param_file ("file.txt"); 
param_file<<dataval; 
+0

Не могли бы вы рассказать нам немного больше о технологии, которую вы используете для распараллеливания? Все ваши дескрипторы возвращены 'fopen' под названием' fid'? – BillBokeey

+0

Чтобы быть впереди всех закрытых избирателей: укажите код, с помощью которого вы создаете файл в C++. Также, пожалуйста, укажите информацию, которую попросил @BillBokeey. Таким образом, мы можем видеть, что происходит, и пытаться помочь вам. – Adriaan

+0

Вопросы поиска справки по отладке (** «почему этот код не работает?» **) должен включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения ** в самом вопросе **. Вопросы без ** ясного заявления о проблеме ** не полезны для других читателей. Смотрите: [Как создать минимальный, полный и проверенный пример.] (Http://stackoverflow.com/help/mcve) - моя забота особенно о последней части, а не о проблеме. – Schorsch

ответ

0

Я не гонялся причиной этого, но у меня есть обходной путь:

try 
    fid = fopen('file_2.txt','r'); 
    a = fscanf(fid,'%f'); 
    fclose(fid); 
    delete('file_2.txt'); 
    fid2 = fopen('file_2.txt','w'); 
    fprintf(fid2,'%f',a); 
    fclose(fid2); 
catch 
    fid = fopen('file.txt','r'); 
    a = fscanf(fid,'%f'); 
    fclose(fid); 
    fid2 = fopen('file_2.txt','w'); 
    fprintf(fid2,'%f',a); 
    fclose(fid2); 
end 

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

Смежные вопросы