2012-11-04 58 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個字節處。

該函數的第一個參數是原點,即來自您計算的原點的字節數,第二個 - 您偏移了多少。

查看fseekreference

我不知道任何庫可以做C++中的行和列的字節定位。您可能需要使用更高級別的函數並逐一解析行(例如,如果您使用C++解決方案,則使用getline)。

+0

它的確如此。在你的例子中,首先從字節0開始,在字節6開始行,在第11個字節開始等等。你看到:'fseek'命令不能理解任何行,句子和單詞。 –

+0

那麼受字符數量影響的字節數呢?如果第16行有6000個字符,它是否會改變第17行第20列的字節數? –

+0

我把編輯搞亂了第一篇評論文章...抱歉... –

0

使用fputs,就像它完成here。爲了識別新的行,你必須遍歷內容並計算換行符(即linux上的'\ n')。您可以使用getc獲取當前指向的角色。實現這個

一種方式是寫一個返回的該商品的特定行開始,像這樣的字節位置的功能:

#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; 
} 

使用則fseek一個可以去通過getRowPos返回的位置加上列數(即字節數,就行了),然後寫使用的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之前,

+0

這不會做我的答案所指出的OP所要求的。 –

+0

我添加了有關計算換行符的信息。它應該能夠工作 - 並且如果您有固定寬度的線條,則會比您建議的讀取整條線更好。 –

+0

我很高興刪除downvotes。我真的很討厭放置它們。 –