read() 함수를 사용하여 파일에서 읽기

각각 별도의 줄에 있는 숫자를 읽는 프로그램을 작성해야 합니다. 파일의 한 줄만 읽은 다음 버퍼에서 int를 읽는 식으로 파일이 끝날 때까지 읽을 수 있습니까? 읽기 및 쓰기를 사용하는 좋은 예를 찾기가 정말 어렵습니다. 내 예제는 어느 정도 작동하지만 `n 문자를 감지 할 때까지 읽은 다음 버퍼를 int로 변환하고 싶습니다.

#include <fcntl.h> 
#include <stdio.h> 
#include <string.h>
#include <unistd.h> 
#include <iostream>

int fd[2];

void readFile(int fd) {
    unsigned char buffer[10];
    int bytes_read;
    int k=0;
    do {
        bytes_read = read(fd, buffer, 10); 
        k++;
            for(int i=0; i<10; i++) {
            printf("%c", buffer[i]);
        }
    }
    while (bytes_read != 0); 
}

int tab[50];

int main(int argc, char *argv[]) {
    if(argv[1] == NULL || argv[2] == NULL)   {
            printf("Function requires two arguments!\nGood bye...\n");
            return -1;
    }
    else {
        if (access(argv[1], F_OK) == 0) {
            fd[0] = open(argv[1], O_RDONLY);
        }
        else { 
            fd[0] = open(argv[1], O_WRONLY|O_CREAT|O_SYNC, 0700);
            const int size = 50;
                for(int i=0; i<size; i++) {
                    char buf[10];   
                    sprintf(buf, "%d\n", i+1);
                    write(fd[0], buf, strlen(buf));
                }
                close(fd[0]);
            fd[0] = open(argv[1], O_RDONLY);
            if (access(argv[2], F_OK) == 0) 
                fd[1] = open(argv[2], O_WRONLY);
            else 
                fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);
        }
    }

    if (access(argv[2], F_OK) == 0) 
        fd[1] = open(argv[2], O_WRONLY); 
    else 
        fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);

    readFile(fd[0]);
    close(fd[0]);
    close(fd[1]);
}

코드를 수정했습니다:

void readFile(int fd) {
    char buffer[10];
    int bytes_read;
    int k = 0;
    do {
        char t = 0;
        bytes_read = read(fd, &t, 1); 
        buffer[k++] = t;    
        printf("%c", t);
        if(t == '\n' && t == '\0') {
            printf("%d", atoi(buffer));
            for(int i=0; i<10; i++) 
                buffer[i]='\0';
            k = 0;
        }
    }
    while (bytes_read != 0); 
}
해결책

바이트 단위로 읽고 각 바이트가 '\n'와 일치하는지 확인하여 일치하지 않으면 버퍼에 저장합니다. 만약 '\n'이면 '\0'을 버퍼에 추가한 다음 atoi()를 사용합니다.

다음과 같이 단일 바이트를 읽을 수 있습니다.

char c;
read(fd,&c,1);

참조 read()

해설 (5)

여기에 이에 대한 매우 좋은 문서가 있습니다 :-
http://www.cplusplus.com/reference/cstdio/fgets/

fgets를 사용하지 않으려면 다음 방법을 사용하세요.

int readline(FILE *f, char *buffer, size_t len)
{
   char c; 
   int i;

   memset(buffer, 0, len);

   for (i = 0; i < len; i++)
   {   
      int c = fgetc(f); 

      if (!feof(f)) 
      {   
         if (c == '\r')
            buffer[i] = 0;
         else if (c == '\n')
         {   
            buffer[i] = 0;

            return i+1;
         }   
         else
            buffer[i] = c; 
      }   
      else
      {   
         //fprintf(stderr, "read_line(): recv returned %d\n", c);
         return -1; 
      }   
   }   

   return -1; 
}
해설 (1)