3

UNIX プラットフォームの C プログラミングで、テキスト ファイルから行の一部を抽出し、それを新しいファイルに出力しようとしています。たとえば、次のように file1.txt があります。

デバイス: ABCDE1

日付: 12/12/12

オペレーター=John Doe

そして、file2.txtに次のように表示したいと思います:

ABCDE1、12/12/12、ジョン・ドウ。

ここに私がこれまでに持っているコードがあります。ファイルの一部を開いたり書き込んだりしましたが、「Device:」の後に情報を抽出する方法がわかりませんでした。「Divice:」自体を表示しません。私のコードは、file1 の最初の行をコピーし、それをファイル 2 に入れます。


#include "stdio.h"
main()
{
    FILE *fs, *ft;
    char ch ;
char file[100]="" ;
char Device [100];
char Date [80];

printf ("Enter file name and directory:");
scanf ("%s",&file);

    fs = fopen (file, "r") ;
    if ( fs == NULL )
    {
           puts ( "Cannot open source file" ) ;
           exit( ) ;
    }

    ft = fopen ( "file2.txt", "w" ) ;
    if ( ft == NULL )
    {
           puts ( "Cannot open target file" ) ;
           fclose ( fs ) ;
           exit( ) ;
    }


fscanf(fs, "%s %s", Device,Date);
fprintf(ft, "%s %s\n", Device,Date);


    fclose ( fs ) ;
    fclose ( ft ) ;
return 0;
}

fscanf() はこれに使用するのに適したコマンドですか? またはこれを機能させるために提案された他のコマンドはありますか? 前もって感謝します。

4

3 に答える 3

6

fscanf()使用可能な機能の 1 つです。scanf() ファミリの関数は %s を「空白で区切られた文字列」として扱うため、「John Doe」で少し問題が発生します。そのため、「John」と読み、次のステップで Doe などを取得します。は次の行にありますが、これはおそらくあなたが望むものではありません。

fscanf() 自体でこれを回避する方法があります。または、 fgets() を使用して行全体を読み取り、それをいくつかの文字列関数で分割することもできます。興味深いことに、線の形式がわずかに異なるため、作業がより難しくなります。

私は意図的にこれを行う方法を正確に説明していません。なぜなら、あなたがこれを行っている理由の一部は学ぶためであると確信しているからです. そして、他人の作品をコピーしても何も学べません。

于 2012-12-21T00:44:25.537 に答える
1

このfscanf関数は、ファイルからデータを読み取り(最初の引数)、指定された形式(2番目の引数)に従ってデータを解析し、形式に基づいて指定された変数(残りの引数)をロードします。ここでの定義を参照してください。これは、fscanf呼び出しの後、DeviceおよびDateバッファに文字列が含まれ、それらDevice:ABCDE1格納されることを意味します。デバイスと日付の両方を印刷する代わりに、日付を印刷するだけです。次に、ファイル全体を処理するループを設定し、EOFフラグを取得するまでfscanfを実行し、各反復で2番目の文字列のみを出力する必要があります。

于 2012-12-21T00:46:15.003 に答える