2016-12-08 6 views
0

사용하여 하위 디렉토리 :쓰기 내가 freopen을 사용하여 하위 디렉토리 내에서 파일을 쓰는 노력하고 있어요 freopen을

freopen("output/output-1.txt", "w", stdout);

나는 현재 디렉토리에 출력로 변경 시도하고 그것은 작동합니다. 대상 출력 파일이 서브 디렉토리에있을 때 오류없이 종료됩니다. 그러나 파일은 작성되지 않습니다. 필요한 디렉토리를 작성해도 문제가 해결되지 않습니다.

void write_to(int subtask, int tc){ 
    string output = string("testcases/subtask-") + to_string(subtask) + "-tc-" + to_string(tc); 
    freopen(output.c_str(), "w", stdout); 
} 

int main(){ 
    for(int i = 1; i <= 25; i++){ 
     write_to(1, i); 
     // rest of code to generate and cout test cases 
    } 
} 

누구에게도 해결책이 있습니까?

+3

할 것 안으로있다. –

+1

'output' 디렉토리는 이미 존재합니까? –

+0

@MichaelWalz 예 이미 존재합니다 –

답변

1

freopen(3) 문서를 참조하십시오. 테스트하고 그 결과를 사용해야합니다

freopen() 함수 이름 문자열 가 path가 가리키는 및 스트림이 함께 스트림 가리키는 연관 파일을 엽니을. 원본 스트림 (있는 경우)이 닫힙니다. 성공적으로 완료 fopen()

, fdopen()과 FILE 포인터를 반환 freopen() :

반환 값에 대한

. 그렇지 않으면, NULL이 반환되고 errno은 으로 설정되어 오류를 나타냅니다.

그래서 당신은 코딩 할 필요가있다 (Linux 또는 일부 POSIX 시스템의 경우) 적어도

void write_to(int subtask, int tc){ 
    string output = 
    string("testcases/subtask-") + to_string(subtask) 
     + "-tc-" + to_string(tc); 
    FILE*outf = freopen(output.c_str(), "w", stdout); 
    if (!outf) { 
    perror(output.c_str()); 
    char pwdbuf[128]; 
    memset (pwdbuf, 0, sizeof(pwdbuf)); 
    getcwd(pwdbuf, sizeof(pwdbuf)-1); 
    fprintf(stderr, "failure in %s\n", pwdbuf); 
    exit(EXIT_FAILURE); 
    } 
} 

(위의 코드 문제를 해결하지만,하지 않습니다 출력 오류에 대한 의미있는 오류 메시지 것이다 ; 아마도 적절한 현재 디렉토리에 코드) 나는 또한 fflush(stdout) 또는 fflush(NULL)으로 mainfor 루프를 종료하는 것이 좋습니다

실행되지 않습니다. Linux 또는 POSIX에, 대신 파일 기술자 수준에서 작동 할 수있는 경우

는 (그래서 리디렉션 코드) 및 ( dup2에 두 번째 인수로 STDOUT_FILENO 사용) open(2) & dup(2)를 사용합니다.

testcases 경우의 디렉토리 당신의 $HOME (쉘에 의해 확장으로 즉, ~/testcases/입니다) 당신이 경로 스펙이 아닌 디렉토리에 실행 파일 실행의 현재 디렉토리를 기준으로

string output = 
    string (getenv("HOME")) + "/" 
    + string("testcases/subtask-") + to_string(subtask) 
    + "-tc-" + to_string(tc); 
+0

감사합니다.이 문제가 해결되었습니다. Permission Denied 오류입니다. 루트로 실행하면 파일을 하위 디렉토리에 만들 수 있습니다. –

+1

보안 허점이 없다면 쓴 프로그램을 루트 권한으로 실행해서는 안됩니다. –