1

txtファイルがあり、txtファイルに「doc1.doc、doc2.doc、doc3.doc」などと書かれているとしましょう。コードでは、このtxtファイルを読み取り、ドキュメント「doc1.doc」を見つけます、doc2.doc..".

C ++を使用してtxtファイルを読んでいる間に、これらのdocファイルをフォルダーに入れたいと思います。出来ますか?

既にフォルダーがあると仮定すると、新しいフォルダーを作成する必要はありません。唯一の懸念は、ファイルをフォルダーに入れることです。

編集:Linuxを使用しています。

4

2 に答える 2

2

GlibのC++バインディングであるglibmmの一部であるGiommを使用できます。見てください、非常に直感的です(低レベルのシステム/ posixC関数以上のもの):

http://developer.gnome.org/glibmm/stable/classGio_1_1File.html#details

これは、ディレクトリの反復に役立つ場合があります。

http://developer.gnome.org/glibmm/stable/classGlib_1_1Dir.html

持ち運びも可能!Glibが機能するすべての場所で機能します。Windows、Linux、MacOS...あなたはLinuxに限定されません。これは、Glimとglibmmに依存していることを意味しますが、GlibはGNU / Linuxソフトウェアで非常に一般的に使用されており、GTKまたはそのバインディングを使用するGUIアプリケーションは、場合によってはGlibを​​ロードする可能性が非常に高いため、ソリューションは実際には余分な依存関係を追加しません。

また、特にLinuxを使用している場合の大きな利点は、自由ソフトウェアのソースコードにアクセスして、そこでコードが何をするかを確認できることです。たとえば、git.gnome.orgで入手できるGnomeのgitリポジトリに移動してから、ドキュメントを処理するプロジェクト(テキストエディタgeditなど)に移動して、ドキュメントをファイルに保存する方法を確認できます。またはさらに良いことに、Glom、Inkscape、GnoteなどのC ++で記述されたプロジェクト(geditはCで記述されています)をチェックして、それらが何をするかを確認してください。

于 2013-02-12T16:18:19.210 に答える
1

あなたの質問は、完全な回答を得るのに十分な情報を提供していません。言語としての C++ には、その意味でフォルダーやファイルを操作する関数が実際にはありません。これは、C++ がプラットフォームに依存しないためです。つまり、C++ コードをコンパイルして、Windows、MacOS、iOS、Android、Linux など、ファイル システムを持たない他の多くのデバイスで実行できます。

もちろん、あなたの場合、おそらく Windows または Linux のいずれかを指しています。その場合は、ファイル システム関数を使用してファイル システム内のファイルをコピーまたは移動できます。

Windows の場合、Win32 API には、ファイルをコピーするためのCopyFileおよび CopyFileEx 関数と、ファイルを移動または名前変更するためのMoveFileおよび MoveFileEx 関数があります。

Linux の場合、sendfile API 関数を使用して、カーネルを使用してファイルをコピーできます。

C/C++ でプラットフォームに依存しないコードを記述して、open/read/write 関数を使用してファイルの内容を別のファイルにコピーできることを指摘しておく必要があります (つまり、ソース ファイルを読み取りモードで開き、ターゲット ファイルを開きます)。書き込みモードで、ソースからの読み取りとターゲットへの書き込みをソース ファイルの最後に到達するまで続けます) が、他のファイル システム関数は、プラットフォーム固有のライブラリなしで再現することが不可能ではないにしても、より困難です。

アップデート

Linux で実行することを指定したので、sendfile 関数を使用する方法は次のとおりです。

int inputFileDesc;
int outputFileDesc;
struct stat statBuffer;
off_t offset = 0;

// open the source file, and get a file descriptor to identify it later (for closing and sendfile fn)
inputFileDesc = open ("path_to_source_file", O_RDONLY);

// this function will fill the statBuffer struct with info about the file, including the size in bytes
fstat (inputFileDesc, &statBuffer);

// open the destination file and get a descriptor to identify it later (for closing and writing to it)
outputFileDesc = open ("path_to_destination_file", O_WRONLY | O_CREAT, statBuffer.st_mode);

// this is the API function that actually copies file data from source to dest;
//   it takes as params the descriptors of the input and output files and an offset and length for the amount of data to copy over
sendfile (outputFileDesc, inputFileDesc, &offset, statBuffer.st_size);

close (outputFileDesc);    // closes the output file (identified by descriptor) 
close (inputFileDesc);     // closes the input file (identified by descriptor) 
于 2013-02-12T16:03:25.030 に答える