2

プロパティと値のペアを既存のファイルに追加したいと考えています。それまでの間、すべてのプロパティをアルファベット順に並べる必要があります。例えば ​​:

[Info] % property 1
value 1 
[system] % property 2
value 2

すべてのプロパティがアルファベット順にソートされるようにプロパティを追加するにはどうすればよいですか。を使用してプロパティと値のペアをファイルの最後に追加できましたが、 fh = fopen(filename,'a')アルファベット順に並べ替えることができません。

これまでのところ、次のようにこれを試しましたが、これでは新しいプロパティと値のペアのみを印刷し続けます。新しいプロパティを印刷したら、残りのプロパティを印刷したいと思います。

function [] = myfun(filename ,propName,propvalue)
rfh = fopen(filename,'r');
tname = tempname();
wfh = fopen(tname,'w');
line = fgetl(rfh);

while ischar(line)

    if (line(1) == '[') && (line(end) == ']')
        property = lower(line(2:end-1)) % from ini file
        String2 = property;
        String1 = propName;
        [sat] = sor(String1,String2)% subfunction
        if sat == -1
            fprintf(wfh,'[%s]\r\n%s\r\n',propName,propvalue);
        else
            fprintf(wfh,'%s\r\n',line);
        end
    else
        fprintf(wfh,'%s\r\n',line);
    end
    line = fgetl(rfh);
end
fclose(rfh);
fclose(wfh);
movefile(tname,filename,'f')

function [sat] = sor(String1,String2)
Index = 1;

while Index < length(String1) && Index < length(String2) && String1(Index) == String2(Index)
    Index = Index + 1;
end

% Return the appropriate code
if String1(Index) < String2(Index)
    sat= -1
elseif String1(Index) > String2(Index)
    sat= +1
else % the characters at this position are equal -- the shorter of the two strings should be "less than"
    if length(String1) == length(String2)
        sat = 0
    elseif length(String1) <  length(String2)
        sat = -1
    else
        sat = +1
    end
end
4

2 に答える 2

3

これは.iniファイルですか?便利なクラスに配置された INI ファイルを処理するための一連のルーチンである MATLAB File Exchange のINIConfigを参照してください。私はそれを使用していませんが、おそらくそれはあなたが必要とすることをするかもしれません.

そうでない場合は、いつでも次のことができます。

  1. ファイルを読み込む
  2. 行ごとにループする
  3. で始まる行[の後に、挿入したいプロパティよりアルファベット順で後の単語が続く行を見つけたら、プロパティと値を挿入します
  4. ファイルの残りを含める
  5. ファイル全体を再度書き戻します。
于 2013-01-20T21:36:56.607 に答える
1

ファイルをに読み込むのはどうstructですか?

function fileData = readFileIntoStruct( fileName )
%
% read [property] value pairs file into struct
% 
fh = fopen( fileName, 'r' ); % read handle
line = fgetl( fh );
while ischar( line )
    % property
    tkn = regexp( line, '\[([^\]+)]\]', 'once', 'tokens' );
    % read next line for value
    val = fgetl( fh );
    fileDate.(tkn{1}) = val;
    line = fgetl( fh ); % keep reading
end
fclose( fh ); % don't forget to close the file at the end.

これで、すべてのデータが、structプロパティとしてfieldnames、値として値を持つ として取得されましたfield

次の方法で簡単にプロパティを更新できるようになりました。

function fileData = updateProperty( fileData, propName, newVal )
if isfield( fileData, propName )
    fileData.(propName) = newVal;
else
    warning( 'property %s does not exist - please add it first', propName );
end

プロパティを追加できます。

function fileData = addProperty( fileData, propName, newVal )
if ~isfield( fileData, propName )
    fileData.(propName) = newVal;
else
    warning ( 'property %s already exists, use update to change its value', propName );
end

次を使用して、プロパティをアルファベット順に並べ替えることができますorderfields

fileData = orderfields( fileData );

次を使用して、単純にファイルに書きstruct戻すことができます。

function writeDataToFile( newFileName, fileData )
fopen( newFileName , 'w' ); %write handle
propNames = fieldnames( fileData );
for ii = 1:numel( propNames )
    fprintf( fh, '[%s]\r\n%s\r\n', propNames{ii}, fileData.(propNames{ii}) );
end
fclose( fh ); 

仮定:

  1. プロパティの名前は正当な Matlab フィールド名です (詳細については、変数の命名を参照してください)。

  2. 各プロパティの値は常に文字列です。

  3. これらの例にはエラー チェック コードは含まれていません (ファイルが見つからない、文字列の形式が間違っているなど)。

  4. 入力ファイルは、追加のコメントなどのない厳密に「[prop] val」のペアであると想定しています。

于 2013-01-21T06:59:57.107 に答える