2012-04-12 8 views
0

私はシステムコールを極端に新しくしました。私はインデックスを使用することはできますが、どのように実装するかについてはあまりよく分かりません。私は、次のとmyfile.txtのを持っ例えばと「>」システムコール - 文字が存在する場合、文字列内の文字を見つける方法

こんにちは:これは(のためのテスト です:「」のは、私はすべてのデータを含むファイル上に見てみたいとしましょう1 =ゼロi> 10); この行には:と

の両方が含まれているので、この行は2つのファイルに書き込まれる必要があります。したがって、書き込み用に2つのファイルを開きます(myfile.txt) ":"を含む行が見つかると、colon.txtファイルに書きます。行に ">"文字が含まれている場合は、greaterthen.txtファイルに書き込みます。

more comments: はい私はバッファを実装する必要があります。

+1

['index'](http://linux.die.net/man/3/index)関数は_システムコールではありません。システムコールは 'open'や' read'( 'fopen'や' fread'ではなく)のような関数です。 –

+1

前の質問に対する正しい回答を受け入れます。あなたはそれの隣のチェックボックスをクリックして、適切な答えを受け入れることができます。 – DipSwitch

答えて

1

申し訳ありませんが、私は質問を誤解しました。

あなたはいくつかのことを考慮する必要があります。はい、あなたはバッファが必要ですが、あなたの行があなたのバッファよりも大きい場合はハンドルもあります。したがって、2つのバッファが必要です.1つは読み込み、もう1つはライン全体をアセンブルするバッファです。 1つのバッファで行うことは可能ですが、複雑すぎるようです。

私のCはかなり錆びていますが、これはうまくいくようです。それはエラー処理が必要で、私はそれがあなたのコーディングスタイルに合っていないと確信していますが、私の一度である&完了テストがうまくいったようです。読取りバッファーは異常に小さく、行がバッファーより大きい状態を示します。現実世界では、読取りバッファーははるかに大きくなります。

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

int findchar(char*, int, char); 

int main() 
{ 
    size_t dataIn = open("myfile.txt", O_RDONLY); 
    size_t gtOut = open("greaterthan.txt", O_CREAT | O_WRONLY); 
    size_t coOut = open("colon.txt", O_CREAT | O_WRONLY); 

    char buffer[12]; 
    int iReadCnt; 
    char* lineBuffer = NULL; 
    int lineBufferSize = 0; 

    // read input file until no more input 
    while (iReadCnt = read(dataIn, buffer, sizeof(buffer))) 
    { 
     int x; 
     int n; 
     char* b; 

     // add buffer to dynamic line buffer 
     n = lineBufferSize + iReadCnt; 
     b = malloc(n); 
     memcpy(b, lineBuffer, lineBufferSize); 
     memcpy(&b[lineBufferSize], buffer, iReadCnt); 
     // free old buffer if exists 
     if (lineBuffer) 
     { 
      free(lineBuffer); 
     } 

     lineBufferSize = n; 
     lineBuffer = b; 

     // look for end of line 
     x = findchar(lineBuffer, lineBufferSize, '\n'); 

     if (x >= 0) 
     { 
      int gtPos; 
      int coPos; 
      int n; 
      char* b; 

      // look for gt 
      gtPos = findchar(lineBuffer, x, '>'); 

      if (gtPos >= 0) 
      { 
       write(gtOut, lineBuffer, x + 1); 
      } 

      // look for colon 
      coPos = findchar(lineBuffer, x, ':'); 

      if (coPos >= 0) 
      { 
       write(coOut, lineBuffer, x + 1); 
      } 

      // remove line from buffer 
      n = lineBufferSize - (x + 1); 
      b = malloc(n); 
      memcpy(b, &lineBuffer[x + 1], n); 
      free(lineBuffer); 
      lineBufferSize = n; 
      lineBuffer = b; 
     } 
    } 

    // close files 
    close(dataIn); 
    close(gtOut); 
    close(coOut); 
    exit(0); 
} 

// simple function to find a character in a buffer 
int findchar(char* buffer, int len, char c) 
{ 
    int i; 
    for (i = 0; i < len; ++i) 
    { 
     if (buffer[i] == c) 
     { 
      return i; 
     } 
    } 

    return -1; 
} 
+0

これは、行全体の行先のように聞こえますが、行頭のどこかにある特殊文字の存在に依存しているため、OPはおそらく行全体をバッファリングする必要があります(たとえば、 'fgets')。 'strchr'を使います。 –

+0

はいバッファーは行く方法です。 – NewLearner

関連する問題