Pratham Solanki Ответов: 3

Octave: чтение нескольких файлов из каталога итеративным способом с использованием переменной filename


Мой каталог содержит 2550 текстовых файлов. Я хочу прочитать эти файлы как отдельные элементы массива ячеек массива file_contents. Читать один файл за раз очень просто. 1.txt в file_contents{1} и так далее. Я хочу создать цикл, который будет считывать все эти файлы в соответствующий элемент массива ячеек file_contents.

Что я уже пробовал:

Код, который я пробовал:

file_contents = {};

for i = 1:2551
    file_contents{i} = readFile('%d.txt', i);
end


Запуск приведенного выше кода дает мне ошибку:

error: fscanf: invalid stream number = -1


Вот функция readFile, которую я использую:

function file_contents = readFile(filename)

fid = fopen(filename);
if fid
    file_contents = fscanf(fid, '%c', inf);
    fclose(fid);
else
    file_contents = '';
    fprintf('Unable to open %s\n', filename);
end

end

Patrice T

А у вас есть вопрос ?
Описать проблемы.

Pratham Solanki

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

3 Ответов

Рейтинг:
2

Richard MacCutchan

file_contents{i} = readFile('%d.txt', i);

Вы передаете два параметра в readFile функция, но она принимает только первую. Поэтому, когда вы пытаетесь позвонить fopen('%d.txt'); такого файла нет, и функция возвращает -1. Вы тогда позвоните fscanf(-1, ...) который терпит неудачу, так как нет такого открытого потока файлов.

Вам нужно изменить свой readFile функция, принимающая оба параметра и объединяющая их для формирования допустимого имени файла. Вам также необходимо проверить значение, возвращаемое из fopen не равно -1, что указывает на ошибку.


Рейтинг:
1

Peter Leow

Вы вызываете функцию

readFile('%d.txt', i)
с 2 аргументами, и эта функция
function file_contents = readFile(filename)
.Заметьте любая вещь сгодится?
+ + + + + {раунд 2]+++++
Цитата:
Да! Я передаю 2 аргумента, в то время как функция принимает только 1.
Есть какие-нибудь предложения относительно того, как я могу решить эту проблему?

Ты что, шутишь? Это ваш код, ваша функция. Во-первых, спросите себя, для чего нужны эти 2 аргумента, если они действительно нужны для выполнения функции, а затем добавьте еще один аргумент в функцию readfile (), в противном случае избавьтесь от избыточного из вызывающей функции. Это очень просто.
Получить код откуда-то и надеяться, что он сработает из коробки,-это ни к чему не приведет. Правильный способ-прочитать соответствующую документацию и сделать это правильно:
1. Основы функций-MATLAB & Simulink[^]
2. Чтение данных из текстового файла-MATLAB fscanf[^]
2. Операторы управления циклом-MATLAB &Simulink[^]


Pratham Solanki

Да! Я передаю 2 аргумента, в то время как функция принимает только 1.
Есть какие-нибудь предложения относительно того, как я могу решить эту проблему?

Peter Leow

решение обновлено.

Рейтинг:
0

Patrice T

Вы получаете ошибку, потому что fopen(filename); терпит неудачу и терпит неудачу потому что '%d.txt' не превращайтесь волшебным образом в имя файла.