2012-11-04 2 views
0

C++에서 텍스트 파일의 특정 줄을 편집하려면 어떻게합니까? 파일을 열어 17 행 20 열에 포커스 또는 포인터를 변경하려고합니다. 이렇게하면 17 행 20 열 뒤에 텍스트를 편집 할 수 있습니다.C++을 사용하여 텍스트 파일을 편집하는 방법

이 작업을 시도했지만 작동하지 않았습니다.

ofstream txtFile("textFile.txt"); 
fseek(txtFile, 17, 20); 
txtFile << "New stuff to enter at this point (overwrites old not insert)"; 

어떻게하면됩니까?

답변

1

fseek은 카운트 라인이 아닌 바이트 수를 찾습니다. 프로그램에 지시하는 것은 포인터를 17 행의 20 열에 배치하는 것이 아니라 파일의 17 + 20 = 37 바이트에 배치하는 것입니다.

함수의 첫 번째 매개 변수는 원점, 즉 계산 한 원점의 바이트 수와 두 번째 - 오프셋 한 수입니다.

referencefseek입니다.

C++의 행과 열에 대해 바이트 위치 지정을 수행 할 수있는 라이브러리는 알지 못합니다. 더 높은 수준의 함수를 사용하고 선을 하나씩 파싱해야 할 것입니다 (예 : C++ 솔루션을 사용하는 경우 getline 사용).

+0

있습니다. 당신의 예제에서 첫번째는 바이트 0에서, 라인은 바이트 6에서, blah는 바이트 11에서 시작합니다. 여러분이 보았습니다 :'fseek' 명령은 라인, 문장 및 단어의 어떤 것도 이해하지 못합니다. –

+0

바이트 수는 문자 수만큼 영향을 받습니까? 16 행에 6000자를 썼다면 17 행 20 열의 바이트 수를 바꿀까요? –

+0

나는 처음 코멘트 게시물에 편집을 엉망으로 만들었다. .. 미안. –

0

here처럼 fputs를 사용하십시오. 새 줄을 인식하려면 내용을 반복하고 줄 바꿈 문자 (예 : '\ n'은 Linux)를 계산해야합니다. 현재 가리키는 캐릭터는 getc입니다. 이를 구현하기 위해

한 가지 방법은 주어진 행이 시작 그래서 같은 곳의 바이트 위치를 반환하는 함수를 작성하는 것입니다 : fseek 한 다음 getRowPos에 의해 반환 된 위치로 갈 수 사용

#include <stdio.h> 

int getRowPos(int row,FILE* fp){ 
    int pos=1,lines=1,currChr; 
    do{ 
    currChr=getc(fp); 
    if(currChr=='\n') 
     lines++; 
    }while(lines<row && currChr!=EOF && ++pos); 
    return pos; 
} 

플러스 열 번호는 (즉 바이트, 라인에 수), 다음과 같이 fputs를 사용하여 원하는 내용을 쓰기는 :

int row=wanted row 
int col=wanted column 

FILE * pFile; 
//Open file for read and write                   
pFile = fopen ("myfile.txt" , "rb+"); 
int rowPos=getRowPos(row,pFile); 
fseek (pFile , rowPos+colPos , SEEK_SET); 
fputs ("my new content" , pFile); 
fclose (pFile); 

당신이 당신의 라인입니다 n은 넓은 말할 너비를 알고 있다면, 당신은 lseek 추가 할 수 있습니다 n 바이트를 건너 뛴다. getc에 전화하기 전에 ead하십시오.

+0

이것은 OP가 내 대답에 지적한대로하지 않을 것입니다. –

+0

줄 바꿈 문자 계산에 대한 정보를 추가했습니다. 그것은 작동해야합니다 - 너비가 고정되어있는 경우에는 제안한대로 전체 줄을 읽는 것보다 낫습니다. –

+0

나는 downvotes를 제거하는 것이 가장 기쁘다. 나는 그들을 배치하는 것이 정말로 싫다. –