2012-12-22 4 views
1

헤더 파일 <fcntl.h><unistd.h>을 사용하는 방법을 배우려고합니다. 프로 시저의 작동을 테스트하는 작은 예제를 만들었지 만 예상대로 작동하지 않았습니다.fcntl.h 및 unistd.h 헤더를 사용하여 파일을 읽고 쓰는 방법은 무엇입니까?

#include <fcntl.h> 
#include <unistd.h> 

int main() { 
    int in=open("test.in", O_RDONLY, S_IREAD); 
    int *a=new int[ 10 ]; 
    read(in, a, 10); 
    int out=open("test.out", O_WRONLY, S_IWRITE); 
    write(out, a, 10); 
    close(in); close(out); 
    return 0; 
} 

입력 파일이 있었다 : 여기 내 코드는 일반적으로 컴파일 1 2 3 4 5 6 7 8 9 10

이 프로그램은,하지만 모든 출력 파일을 생성하지 않았다. 아무도 내 코드에 어떤 문제가 있다고 말할 수 있습니까? 미리 감사드립니다.

+0

어. 코드에 모든 오류 검사가 누락되었습니다. 그들을 끼워 넣으면 다른 사람들에게 무엇이 잘못되었는지를 묻지 않아도됩니다. 당신의 프로그램은 당신에게 말할 것입니다! – melpomene

+1

보너스 문제 : 입력 파일에'int'가 10 개 포함되어 있지 않고 코드가 10'int's (10 바이트 읽음)를 읽으 려하지 않습니다. – melpomene

+0

@melpomene 언급 한 문제를 어떻게 해결할 수 있습니까? –

답변

0

opengroup

#include <fcntl.h> 
... 
int fd; 
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; 
char *filename = "/tmp/file"; 
... 
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, mode); 
... 

에서 당신의 코드와 비교합니다.

+0

이로 인해 허가가 거부되었습니다. – Sohaib

1

두 번째 파일을 열 때 사용하는 플래그 인 O_WRONLY은 출력 파일을 만들지 않습니다.이 파일은 존재하지 않습니다. O_CREATE 또는 O_APPEND과 같은 다른 플래그를 사용해보세요. 이 link은 파일 작성 및 작동을 처리하는 데 여러 플래그를 사용하려는 경우 유용 할 수 있습니다. 행운 =)

2

Divide et impera.

쓰기 부분 :

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() { 
    int const a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    int const out { open("testnums.out", 
      O_WRONLY | O_CREAT, S_IWRITE | S_IREAD) }; 
    if(out==-1) { 
    perror("Cannot open file"); 
    return 1; 
    } 
    ssize_t const written { write(out, a, sizeof(a)) }; 
    if(written<0) { 
    perror("Write error"); 
    } 
    close(out); 

    return 0; 
} 

컴파일 및 실행 :

$ hexdump testnums.out 
0000000 0001 0000 0002 0000 0003 0000 0004 0000 
0000010 0005 0000 0006 0000 0007 0000 0008 0000 
0000020 0009 0000 000a 0000      
0000028 

이 아님을 유의하시기 바랍니다을 :

$ g++ -std=c++0x -Wall -Wextra tout.cc 
$ ./a.out 

는 'A'배열에서 기록 이식성 - 각 컴파일러/아키텍처에는 여기에 약간의 다른 출력이있을 수 있습니다.

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 

int main() { 

    int const in { open("testnums.out", O_RDONLY) }; 

    if(in==-1) { 
    perror("Cannot open file"); 
    return 1; 
    } 

    int a[10]; 
    ssize_t const r { read(in, a, sizeof(a)) }; 
    if(r!=sizeof(a)) { 
    fprintf(stderr, "Could not read complete array."); 
    return 1; 
    } 
    if(r<0) { 
    perror("Read error"); 
    close(in); 
    return 1; 
    } 
    close(in); 

    for(unsigned int i(0); i<sizeof(a)/sizeof(int); ++i) { 
    printf("%d ", a[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

컴파일 및 실행 :

$ g++ -std=c++0x -Wall -Wextra tin.cc 
$ ./a.out 
1 2 3 4 5 6 7 8 9 10 

일반 : 당신의 코드에서 작은 문제가 많이있다 (여기

는 이것을 다시 읽어 표준 출력에 기록하는 부분입니다 like : 반환 값 검사가 완전히 빠져있다. 필요한 모든 헤더 파일이 포함되어 있지 않고 잘못된 바이트 수가 기록된다 ...)

$ man 2 open 
$ man 2 read 
$ man 2 write 
$ man 2 close 
012와 같은 다른 맨 페이지를 읽고 싶을 수도있다.
+0

당신의 코드와'# include's를 복사하고 있는데,'S_IREAD' 모드 매개 변수에 대한 에러를 얻습니다.'S_IREAD' "는이 범위에서 delcared되지 않았습니다. 나는'S_IWUSR'와'S_IRUSR'도 시도했습니다 – John