죄송합니다. 질문을 잘못 읽었습니다.
몇 가지 사항을 고려해야합니다. 예, 버퍼가 필요하지만 라인이 버퍼보다 큰 경우 핸들도 있습니다. 따라서 두 개의 버퍼가 필요합니다. 하나는 버퍼에, 다른 하나는 전체 버퍼를 어셈블하는 버퍼입니다. 하나의 버퍼에서 가능할지라도 지나치게 복잡하게 보였습니다.
내 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;
}
['index'] (http://linux.die.net/man/3/index) 함수는 _system call_이 아닙니다. 시스템 호출은'open' 또는'read'와 같은 함수입니다 (그러나'fopen'이나'fread'는 아닙니다). –
이전 질문에 대한 답을 수락하십시오. 옆에있는 확인란을 클릭하여 적절한 대답을 수락 할 수 있습니다. – DipSwitch