2012-04-12 3 views
0

저는 시스템 호출이 극히 새롭습니다. 인덱스를 사용할 수는 있지만 구현 방법은 확실하지 않다고 생각합니다. ":"및 ">"예를 들어시스템 호출 - 캐릭터 내에 문자가있는 경우 문자열을 찾는 방법

나는 다음과 MYFILE.TXT 있습니다

인사를 :의 내가 모든 데이터와 파일을 찾아하고 싶은 말은하자이을위한 테스트 입니다 (1 = 0> 10); 이 줄에는 : 및>

이 포함되어 있으므로이 파일을 작성해야합니다. 쓰기 용으로 두 개의 파일을 열고 (myfile.txt) ":"가 포함 된 줄을 발견하면 colon.txt 파일에 씁니다. ">"문자가 포함되어 있으면 greaterthen.txt 파일에 쓸 것입니다.

more comments : 예 버퍼를 구현해야합니다.

+1

['index'] (http://linux.die.net/man/3/index) 함수는 _system call_이 아닙니다. 시스템 호출은'open' 또는'read'와 같은 함수입니다 (그러나'fopen'이나'fread'는 아닙니다). –

+1

이전 질문에 대한 답을 수락하십시오. 옆에있는 확인란을 클릭하여 적절한 대답을 수락 할 수 있습니다. – DipSwitch

답변

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

관련 문제