2017-12-27 26 views
-4

C++에서 동일한 파일에 두 개의 포인터가 필요합니다.C++의 파일에 대한 다중 출력 포인터

CASE A: 
0 
1 
4 


11 
14 

하지만 싶어 :

#include <fstream> 

int main() 
{ 
    double a; 
    std::ofstream fout1("out.txt"); 
    fout1 << "CASE A:"<<std::endl; 

    std::ofstream fout2("out.txt", std::fstream::app); 
    fout2 << "CASE B:" <<std::endl; 

    for (int i=0; i < 3; i++){ 
     a = i*i; 
     fout1 << a << std::endl; 
     fout2 << 10+a <<std::endl; 
    } 
    return 0; 
} 

이 코드

나를주고 내 실제 코드 변수 "a"는 거대한 계산이다에서

CASE A: 
0 
1 
4 
CASE B: 
10 
11 
14 

를, 그래서 않을 것 double를 할 좋은 해결책이 될 수 있습니다. 나는 2 가지 해결책을 생각했다 :

  1. 벡터에 "a"를 저장하기 위해 double을 사용한다.
  2. 동일한 파일 (현재 질문)에 두 개의 포인터 사용;

2가 가장 좋으므로 어떻게 동일한 파일에 두 개의 포인터를 사용할 수 있습니까?

+0

당신은 "0"전에 "사례 B"를 쓰고 싶어,하지만이 후 * 표시 한 * "0"파일에, 맞습니까? – Beta

답변

0

동일한 파일에 쓰기 위해 두 개의 스트림을 사용하면 악몽으로 변할 것입니다. 다른 하나가 변경 사항을 볼 수 있도록 한 스트림이 변경 될 때마다 플러시하고 다시 동기화해야합니다. 이 아이디어를 없애고 단일 출력을 사용하여 문제에 접근하는 것이 훨씬 좋습니다.

당신은 아이디어를 다른 스트림 통화로 전환하려고 할 때마다 스틱하려는 경우 :

firstStrm.flush(); 
secondStrm.tie(firstStrm); 
secondStrm.seekp(firstStrm.tellp()) 
firstStrm이 작업이 완료 스트림으로 작성하고 secondStrm 스트림 당신입니다

글쓰기를 시작하고 싶습니다.

+0

이것은'fout1'에 모든 데이터를 쓸 때까지 파일에서'fout2'로 쓰는 것을 어디서 알지 못하기 때문에 OP가 원하는 것을하지 않을 것입니다. – 1201ProgramAlarm

0

근본적인 문제는 fout1에 씁니다. 이전에 fout2에 기록합니다. 파일에서 "CASE B"데이터를 쓰기 시작해야하는 위치를 모르기 때문에 "CASE B"로 시작하기 전에 모든 "CASE A"데이터가 기록 될 때까지 기다려야합니다.

CASE B 데이터를 다른 (임시) 파일에 쓴 다음 CASE A를 완료하면 해당 데이터를 복사하고 (임시 파일을 삭제) 문자열에 쓸 데이터를 누적 할 수 있습니다 버퍼를 쓴 다음 출력하십시오.

a 값을 모두 vector에 저장 한 다음 원하는대로 처리 한 다음 1을 수행하십시오. 이것은 아마도 가장 빠른 방법 일 것입니다. 비록 많은 양의 데이터 메모리가 염려 스러울 수 있고 두 파일 접근 방식을 따라야 만한다면 말이죠. 같은 파일이 포인터을 원하는 경우에

0

, 다음을 만들 :

std::ofstream fout("out.txt"); 
std::ofstream * fout1(&fout); 
std::ofstream * fout2(&fout); 

문제를 당신이 임의의 순서로 데이터 출력을 가질 수있는 출력 스트림에 하나 이상의 포인터를 갖는, 실행에 따라 다릅니다. 다중 스레드 또는 다중 태스크의 경우 더욱 그렇습니다.

다른 해결책은 출력 스트림을 생성자 또는 함수로 전달하는 것입니다. 클래스는 스트림의 사본 수 있습니다 :

class Hello 
{ 
    public: 
    Hello(std::ostream& output) 
    : m_output(output) 
    { } 
    private: 
    std::ostream& m_output; 
};