2017-04-12 3 views
0

필자가해야 할 일은 입력란에서 *을 입력하여 주석이 식별되는 입력 파일에서 일부 매개 변수 값을 읽는 것입니다. 은 "유용한"라인의 값은 다음과 같이 세미콜론으로 구분됩니다C++ - 출력 스트림의 한 줄 시작 부분에서 다른 문자로 바꾸기

10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03; 

그리고 내 입력 파일이 같은 여러 줄 수 있습니다.

내가 뭘하고 싶은지 *을 각 라인의 시작 부분에 삽입하면된다. 두 번째로 파일을 읽으면 다음 라인으로 건너 뛰고 바로 다음 라인으로 넘어갈 것이다. 하나.

내 목표는 내 프로그램의 여러 인스턴스를 동시에 실행하고 파일을 순서대로 액세스하여 필요한 입력 매개 변수를 얻는 것이므로 필요합니다. 그래서 나는 각 인스턴스가 다른 매개 변수를 갖기를 원한다. 나는이 같은, 각 행의 시작 부분에 더미 문자를 삽입 할 일은 생각 무엇

: 나는 그래서 그것을 읽을 때 *

b10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03; 

을하고 (이 예에서는 b을)를 교체 두 번째로 나는 주석을 다루는 줄을 읽었습니다. 나는 peek() 호출 b를 읽을 수 있지만, * 문자가 항상 파일의 끝에 추가되면

나는 put('*')<< '*'을 사용했습니다. 파일의 중간에 쓸 수는 없지만 파일 중간에 덮어 쓸 수는 있지만 읽었습니다. 내가 무엇을 할 수 있을지?

* FORMAT: 
* MAX_HEIGHT; SEED; p0; p1; pd; pp; epsilon; 

b10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03; 
b40; 32541615; 0.18; 0; 0.00015; 0.01485; 0.03; 
+0

당신은 어떤 인스턴스 프로그램이 어떤 매개 변수를 사용하는지 알아야합니까? 아마 각 인스턴스에 대해 하나의 매개 변수 파일을 사용하고 명령 줄 인수로 파일 이름을 전달합니다. 또는 하나의 파일을 고집한다면 파일의 주어진 줄에서 매개 변수를 읽습니다 (명령 줄 인수로 다시 전달됨). Imho가 프로그램의 여러 인스턴스를 읽고 동일한 파일에 쓰는 것만으로도 불필요한 overcomplication이됩니다. – user463035818

+0

근본적인 문제는 일부 동기화가 없으면 프로그램의 여러 인스턴스가 이전에 같은 행을 읽었던 경쟁 조건을 방지 할 수 없다는 것입니다 그들 중 누구라도 라인을 업데이트하기 위해 변경을합니다. 이 문제를 해결하면 원래의 문제를 더 깔끔하게 해결할 수 있다는 이점이 있습니다. –

+0

@MichaelBurr 알아요.물론 한 번에 같은 파일에서 여러 스레드를 읽으려면 먼저 동기화를 구현해야합니다. 하지만이 문제에 간단한 대답이 있는지 궁금했습니다. – jackscorrow

답변

1

그래서 당신은 당신이 읽고있는 파일을 수정할 : 여기

는 가능한 입력 파일의 예입니다? 그렇다면 기본적으로 다시 작성해야합니다.

일반적인 방법 중 하나는 파일 전체를 메모리로 읽어 메모리 버퍼를 수정 한 다음 파일을 (수정 된) 메모리 버퍼로 덮어 쓰는 것입니다.

또 다른 일반적인 방법은 파일이 메모리에 맞게 커지면 줄 단위로 읽고 줄을 수정하여 새 임시 파일에 쓰는 것입니다. 그런 다음 모든 입력 내용을 읽은 후 임시 파일의 이름을 실제 파일로 바꾸면 해당 파일의 데이터가 바뀝니다.

대체 할 줄의 시작 부분에 b과 같은 특별한 표식 문자가 필요없이이 두 가지 해결책을 모두 사용할 수 있습니다.

+0

하지만 내가하고 싶은 것은'char'를 같은 공간을 차지할 다른'char'로 대체하는 것입니다. 전체 파일을 처음부터 작성해야합니까? – jackscorrow

+0

@jackscorrow 특수 문자를 대체 할 정확한 위치를 찾으려면 파일을 * 탐색 *해야합니다. 실제로 내 대답에서 말한 가능한 방법보다 더 많은 작업이 될 수 있습니다. 또한 제안 된 가능한 솔루션을 사용하면 특수 문자를 사용할 필요가 없으므로 첫 번째 숫자를 더 쉽게 읽을 수 있습니다 (문자열로 읽거나 첫 번째 문자를 제거 할 필요가 없으며 문자열을 정수 값). –

+0

확인. 나는 이것으로 결국 갈 것이라고 생각한다. 하지만 당신은 문자열로 그것을 _read, 첫 번째 문자를 제거하고 문자열을 정수 value_로 변환, 내 무지를 용서하지만 정수 또는 이중 숫자를 읽을 수있는 다른 방법이 있습니까? 그것들은 정확히 이런 종류의 값을 저장하기 위해 내가 따르는 단계 들이기 때문에. – jackscorrow