2016-12-07 6 views
0

3つのコマンドライン引数を取るプログラムを作成しようとしています。1.既存のファイル名2.新しいfile、3.各行から新しいファイルにコピーする文字数。ここで1行のファイルから特定の行に特定の文字数をコピーする方法

は、私がこれまで持っているものです:事前に

int main(int argc, char *argv[]) { 

    int size = atoi(argv[3]); // The number of characters to copy 
    char content[size]; 
    char line[size]; 

    FILE *f1 = fopen(argv[1], "r"); // Read from first file               
    FILE *f2 = fopen(argv[2], "w"); // Write to second file               

    if (f1 == NULL || f2 == NULL) { 
     printf("\nThere was an error reading the file.\n"); 
     exit(1); 
    } 

    while (fgets(content, size, f1) != NULL) { 
     // This is what I had first: 
     fprintf(f2, "%s", content);                     

     // And when that didn't work, I tried this: 
     strncpy(line, content, size); 
     fprintf(f2, "%s", line);                       
    } 

    fclose(f1); 
    fclose(f2); 
    return 0; 
} 

ありがとう!

+0

あなたの質問は何ですか? – kaylum

+0

予想される出力例を示してください。 – BLUEPIXY

+0

argvはargv [0]ではなくargv [1]から開始しますか? –

答えて

1

問題はどうすればfgetsが動作しているかです。 またはの次の行の最後を読み取るように設計されています。最大数はsize文字です。どちらか早い方が早くなります。改行文字を読み込む前にsizeの文字を読み取ると、それはsize長さの文字列を返しますが、残りの行は入力ストリームに残り、次のfgets呼び出しで読み込めます。したがって、sizeが10の場合、ループは10文字のチャンクで長い行を読み取るだけですが、一度に10行のフルラインを出力します。

現在のプログラムの構造を保持したい場合は、fgetsを使用して完全な行を読み込みます(バッファとsizeの値は可能な限り長い行よりも長くなります)。現在、行をn文字に切り捨て(NULで終える、と言う)、短縮された行を出力します。

ヒントが十分か、実際の使用例が欲しいですか?

編集:さて、ここで1つの解決策があります。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char line[4096]; 

int main(int argc, char *argv[]) { 

    int size = atoi(argv[3]); // The number of characters to copy 

    FILE *f1 = fopen(argv[1], "r"); // Read from first file 
    FILE *f2 = fopen(argv[2], "w"); // Write to second file 

    if (f1 == NULL || f2 == NULL) { 
     printf("\nThere was an error reading the file.\n"); 
     exit(1); 
    } 

    // read whole line 
    // note: if the whole line doesn't fit in 4096 bytes, 
    // we'll be treating it as multiple 4096-byte lines 
    while (fgets(line, sizeof(line), f1) != NULL) { 

     // NUL-terminate at "size" bytes 
     // (no effect if already less than that) 
     line[size] = '\0'; 

     // write up to newline or NUL terminator 
     for (char* p = line; *p && *p != '\n'; ++p) { 
      putc(*p, f2); 
     } 
     putc('\n', f2); 

    } 

    fclose(f1); 
    fclose(f2); 
    return 0; 
} 
+0

私はあなたが言っていることを得るが、それはstrncpyラインがやっているだろうか?基本的に、読み込まれたフルラインを新しいラインにコピーしてから、それを書き込みファイルに書き込むか? –

+0

「size」が10に設定された10000文字の1行のファイルを読んでいるとしましょう。ここでは、 'strncpy'バージョンを使用してループを実行します:(1)' fgets'を使用して、文字を 'f1'から' content'バッファに読み込み、NULは全部で10文字を終了します。 (2) 'strncpy'を使って、9文字とNULターミネータを' content'から 'line'にコピーします。 (3)これらの9文字を 'f2'に出力します。 (4)最初の文字に戻り、次の9文字を取得します。 –

+0

うん、わかりました。問題がなければ、実際のソリューションを投稿しても構いませんか? –

関連する問題