Проблемы:
В вашем коде есть несколько ошибок или, по крайней мере, сбивает с толку:
Во-первых, вы открываете выходной файл в режиме 'text'
(обозначается t
в вашем заявлении об открытии файла steve=fopen('JuneWeather.txt','at');
).Это хорошо, так как вы имеете дело с текстовыми файлами, но затем вы используете fwrite
, низкоуровневую функцию, предназначенную для записи двоичных данных.
Я дам вамниже решения с fprintf
, поскольку я действительно рекомендую использовать правильную функцию для работы, особенно когда вы не уверены в том, что делаете.
Кроме того, вы упустили тот факт, чтоопределение fgetl
: Чтение строки из файла, удаление символов новой строки .Поэтому, конечно, вам придется помещать символ новой строки в конце каждой строки, так как каждый раз, когда вы читаете одну строку, сбрасывается исходный символ новой строки.
Что касается выбранного символа новой строки, вы можете использоватьавтоматический метод вроде:
if ispc
strNewline = '\r\n' ;
else
strNewline = '\n' ;
end
Но в вашем случае это даже не нужно.Поскольку вы открыли выходной файл в режиме text , документация сообщает вам:
Чтобы открыть файлы в текстовом режиме, присоедините букву 't' к аргументу разрешения, например'rt' или 'wt +'.
В системах Windows® в текстовом режиме:
- Read operations that encounter a carriage return followed by a newline character ('\r\n') remove the carriage return from the input.
- Write operations insert a carriage return before any newline character in the output.
В последней строке указывается, что MATLAB автоматически управляет возвратом каретки (\r
), поэтому вам не нужно беспокоиться об этом.Просто используйте только \n
, когда вам это нужно.
( обратите внимание, что на компьютере ПК, если вы не открывали файл в текстовом режиме, вам придется вставить каретку, если выхотел это ).
Решение (я):
Для целей примера я создал 2 текстовых файла test_1.txt
и test_2.txt
, которые содержат толькозаголовок и несколько строк значений, разделенных комой каждая.Код, который работает и наиболее близок к вашей реализации, выглядит следующим образом (я удалил строки отладки о count
и комментариях, не стесняйтесь вставлять его там, где это необходимо):
fileOut = 'testout.txt' ;
steve = fopen(fileOut,'at');
for i =1:2
fid1=fopen(sprintf('test_%d.txt', i));
while ~feof(fid1)
% This reads the line, but REMOVE the newline character at the end
line=fgetl(fid1);
% so we write the line and ADD the newline character at the end
fprintf(steve, [line '\n']);
end
fclose(fid1);
end
fclose(steve) ;
В качестве альтернативы:
Поскольку вы работаете с текстовым файлом и, кажется, просто объединяете их без какого-либо выбора / редактирования / обработки каждой прочитанной строки, вы можете сделать это намногопроще, прочитав каждый файл полностью и записав его за один раз в выходной файл.Вы можете сделать это с помощью функции fileread
.
Что-то вроде:
%% merge text data using "fileread"
steve = fopen('testout.txt','a');
for i =1:2
StringFileContent = fileread( sprintf('test_%d.txt', i) ) ;
fprintf(steve, StringFileContent );
end
fclose(steve) ;
Будет выдавать точно такой же результат, что и выше, и будет значительно быстрее в течение длительного времении / или многочисленные файлы.Просто обратите внимание в последнем фрагменте кода, файл NOT открыт в текстовом режиме, как и раньше.В противном случае matlab будет автоматически вставлять \r
перед каждым \n
, даже если \r
уже присутствовал (фактически дублируя каждый \r
).Это потому, что функция fileread
не связывается с символами новой строки, она просто читает все как строку.