2017-06-01 12 views
-1

私はC++プログラミングが初めてで、ファイルの読み書きを練習しようとしています。私は現在のディレクトリのすべてのファイルのサイズを取得しようとしています。現在のディレクトリにあるファイルの名前を取得した後、テキストファイルの中に配置します。だから今私は立ち往生していて、ここからどこに行くのか分からない。C++:現在のディレクトリ内のすべてのファイルのサイズを取得する

#include <iostream> 
#include <fstream> 
#include <algorithm> 

using namespace std; 

       // FILE FUNCTION 

void fileStuff(){ 

} 

       // MAIN FUNCTION 

int main(int argc, char const *argv[]) 
{ 
// ERROR CHECKING 
if(argc != 3){ // IF USER DOESN'T TYPE ./nameOfFile, AND THE OTHER REQUIRED ARGUMENTS. 

    cout << "Incorrect. Try Again" << endl; 
    exit(-1); 
} 

ifstream file; 
string fileContents; 

system("find . -type f > temp.txt"); 

file.open("temp.txt"); 

if (!file){ 

    cout << "Unable to open file: temp.txt" << endl; 
    exit(-1); 
} 
while(file){ 

    getline(file, fileContents); 
    cout << fileContents << endl; 
} 

file.close(); 
return 0; 
} 
+2

[C++ filestreams(fstream)を使用して、ファイルのサイズをどのように決定できますか?](https://stackoverflow.com/questions/2409504/using-c-filestreams -fstream-how-you-you-you-a-you-a-you-a-fileを決定することができます) – vonludi

+0

あなたはそれらをテキストファイルに入れます。あなたは次に何をしたいですか? –

+0

これらのファイルをテキストファイルに入れたら、それらのファイルのサイズも出力したいと思っています。 – notSoExperiencedCoder

答えて

2

C++14(およびそれ以前のバージョン、特にC++11)は約file systemsdirectories(まだ)知りません。 C++ 17については、file system libraryを参照してください。それ以外の場合、コードはオペレーティングシステム固有のものですが、Boostライブラリにはfile system supportが含まれています。

LinuxやPOSIXシステムで動作していることを前提としています。

あなたのプログラムは外部コマンド(find(1))を使用しています。そのようなコマンドから読み取る場合は、popen(3)pcloseと使用すると、一時ファイルは必要ありません。ところで、find . -type f -lsを使うことができます。

しかし、外部コマンドを使用する必要はありません。これを避けるためには、より安全で高速です。

ファイル名には改行文字が含まれている可能性があります。そのアプローチでは、特別な場合が必要になります。ファイル名にはタブ文字(または他の制御文字)を含めることもできます。その場合はfind . -type fが特別に動作し、特別な場合も必要です。実際には、それは非常に味が悪く、ファイル名に改行やタブ文字を入れることはほとんどありません。これらの奇妙なケースを忘れるかもしれません。

nftw(3)を使用できます。再帰的にopendir(3) &ループをreaddir(3)(以降はclosedir)に使うことができます。

ファイルパスを持っていたら、あなたはそのサイズ(フィールドst_size)を含め、そのファイルのメタデータを取得するためにstat(2)を使用します。ところで、/bin/ls/usr/bin/findプログラムでそれを使用しています。

readdir(3)関数は、で終わるstruct direntポインタを返します。 ...の2つのエントリをスキップすることをお勧めします(を使用して"."".."と比較するか、難しい方法を比較してください)。次に、文字列カテナネーションを使用して完全なファイルパスを構築します。あなたは(本物のC++で)std::stringを使用するか、snprintf(3)またはasprintf(3)を使用することができます。 readdir現在のディレクトリ.の場合は、フィールドにstat(2)と直接電話することができます。

BTW exit(-1)は正しくありません(確かに味が悪いです)。 exit(3)を参照してください。はるかに判読可能な代替手段はexit(EXIT_FAILURE)

+1

[Boostの例](http://boost.2283326.n4.nabble.com/Directory-size-via-boost-filesystem-problem-td2563938.html) – MSalters

関連する問題