2012-02-05 15 views
0

ファイルの特定の場所に書き込むにはどうすればよいですか?だから私は100をスキップして、新たな入力配列とmscを上書きしたいファイルC++での書き込み

100 10 20 34 32 43 44 

:私のようにそれを更新したい

100 msc 

:私のファイルは、以下の情報が含まれています。

答えて

2

私が知っている最善の方法は、ファイルの完全な内容を読み込み、必要なものを上書きするためにいくつかの文字列操作を使用することです。変更した情報を同じファイルに書き戻し、その内容を上書きすることができます。

0

ktodiscoの方法はうまくいきますが、別のオプションとして、ファイルを読み取り/書き込み権限で開き、バッファ内の書き込み場所にファイル位置ポインタを移動してから、必要なものを書き込んでください。 C++はおそらくこれを行うための詳細を持っていますが、C stdioライブラリだけできれいに行います。このような何か:

#include <stdio.h> 

int main() { 
    FILE* f = fopen("myfile", "r+"); 
    /* skip ahead 4 characters from the beginning of file */ 
    fseek(f, 4, SEEK_SET); 
    /* you could use fwrite, or whater works here... */ 
    fprintf(f, "Writing data here..."); 

    fclose(f); 
    return 0; 
} 

あなたは参照としてこれらを使用することができます。 - fseek - fwrite

は、私は助けを願って! Cでは

== EDITの==

++ iostreamクラスは、上記のすべてを行うことができるようです。参照:iostream

+0

これは、ファイル内の既存のデータを上書きする場合に有効です。しかし、既存のファイルの途中に新しいデータを挿入したい場合は、ktodiscoのアプローチに従わなければなりません。私はOPが本当にやろうとしていることは分かりませんが、後者のように見えます。 – Sean

+0

@Sean私は、OPがそれを上書きしたいと思っています。(私は100をスキップし、新しい入力配列で "msc"を上書きしたいと思っています)そうでなければ、ktodiscoのメソッドはおそらく最高です。 – Miguel

+0

ええ、 "msc"は3文字です。もし彼がそれ以上のことを書いていれば、彼はそれ以降のことを書いていくでしょう。だからこそ、私は彼が挿入したいと思って、私は最初にファイルを読む必要があるように見えます。 – Sean

1

まず、そのようなファイルを変更することはできないことを理解する必要があります。
あなたはそれより少し難しいかもしれませんが(スペースを必要とするので)。

あなたがしなければならないことは、ファイルを読み込んで新しいファイルに書き込んだ後、元のファイルに名前を変更することです。

どこから読み込むべきか、挿入するものを正確に知っているので、最初にそれを行う必要があります。

void copyFile(std::string const& filename) 
{ 
    std::ifstream input(filename.c_str()); 
    std::ofstream output("/tmp/tmpname"); 


    // Read the 100 from the input stream 
    int x; 
    input >> x; 


    // Write the alternative into the output. 
    output <<"100 10 20 34 32 43 44 "; 

    // Copies everything else from 
    // input to the output. 
    output << input.rdbuf(); 
} 

int main() 
{ 
    copyFile("Plop"); 
    rename("Plop", "/tmp/tmpname"); 
}