Добавить содержимое одного файла в другой файл без потери форматирования - PullRequest
0 голосов
/ 25 мая 2018

У меня есть несколько файлов в формате .txt.Моя цель - объединить содержимое всех этих файлов в исходный файл (также в формате .txt) без изменения форматирования.Для начала я просто хочу скопировать содержимое из одного файла в другой.

Следующий фрагмент кода позволяет копировать содержимое.Однако я теряю форматирование.

%   load destination file in append mode
destFileId = fopen(destFile, "a");
%   load source file in read mode
sourceFileId = fopen(sourceFile, "r");

%   Extract content from source file
content = textscan(sourceFileId, '%c');

%   Append content into destination file
fprintf(destFileId, content{:});

%   Close both files
fclose(destFileId);
fclose(sourceFileId);

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Проблема с использованием fprintf для объединения файлов заключается в том, что если файл содержит специальные символы (например, \ или %), то fprintf, скорее всего, завершится ошибкой.Очень похожим подходом будет использование fread и fwrite для прямой конкатенации содержимого файла без какой-либо интерпретации.

function catfiles(dest, sources)
    fdest = fopen(dest, 'wb');

    for source = 1:numel(sources)
        fsource = fopen(source,'rb');
        source_data = fread(fsource);
        fwrite(fdest, source_data);
        fclose(fsource);
    end

    fclose(fdest);

Использование

>> catfiles('dest.txt', {'source1.txt', 'source2.txt'});

Я не включил все проверки, которые выполняет ответ @ CitizenInsane, но это хорошая идея.

0 голосов
/ 25 мая 2018

Я думаю, что использование fileread вместо textscan поможет сохранить форматирование по вашему желанию (fileread читает весь файл как простую строку Matlab, сохраняя как для пробелов, так и для новых строк)

Вот некоторый псевдокод (не тестировался):

 function [] = Dummy(desFile, sourcesFiles)
 %[
    % Open destination file for writing (discarding previous content)
    [destFileId, msg] = fopen(destFile, 'w');
    if (desFileId < 0), error(msg); end

    % Make sure to close file on any error, ctrl+c (and normal termination of course)
    cuo = onCleanup(@()fclose(destFileId));

    % Copy file contents to destination
    count = length(sourcesFiles);
    for fi = 1:count,

        text = fileread(sourcesFiles{fi});
        fprintf(destFileId, '%s', text);

    end
 %]     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...