c++windowsでファイルを開く方法とフォルダの下のすべてのファイルにアクセスする方法

7112 ワード

一、streamストリーム方式でファイルを開く
ifstreamハードディスクからメモリ、ファイルの読み取り
ofstreamメモリからハードディスクへ、ファイルを書く
C++にはstreamというクラスがあり、すべてのI/Oはこの「ストリーム」クラスに基づいており、ファイルI/Oも含まれています.
1)挿入器(<
ストリームにデータを出力します.システムにはデフォルトの標準出力ストリームがあり、一般的にはディスプレイを指します.例えばc++でよく使われるcout<「hello world」;文字列「hello world」を標準出力ストリームに出力する
2)分析器(>>)
ストリームからデータを入力します.システムにもデフォルトの標準入力ストリームがあり、一般的にはディスプレイを指し、cin>>a;標準入力ストリームから指定したタイプのデータが読み込まれたことを示します.
c++では、ファイルに対する操作はstreamのサブクラスfstreamによって実現されるので、使用時にヘッダファイルfstreamを追加することに注意してください.h
一般的なファイル操作
1.ファイルを開く
void open(const char* filename, int made, int access);
パラメータ:
filename:開くファイル名
made:ファイルを開く方法
アクセス:ファイルを開くプロパティ
ファイルを開く方法はクラスiosで定義されます
一般的な値は次のとおりです.
ios::appは追加で開きます.新しいデータを末尾に追加します.
ios::ateファイルを開くとファイルの最後にナビゲートし、ios::appにはサブプロパティが含まれます.
ios::binaryはファイルをバイナリで開き、デフォルトではテキストで開きます.
ios::inファイルを入力で開く
ios::outファイルは出力で開きます
ios::nocreateはファイルを作成しないので、ファイルが開くと存在しないと失敗します.
ios::noreplaceはファイルを上書きしないので、開くとファイルが存在しません.
ios::truncファイルが存在する場合は、ファイル長を0に設定します.
ファイルの開き方を使用する場合は、|接続ios::out|ios::binary
 
ファイルを開くプロパティは次のとおりです.
0:一般ファイル、開くアクセス
1:読み取り専用ファイル、
2:隠しファイル
4:システムファイル
+または|で上記のプロパティを直列に接続できます.たとえば、3または1|2は読み取り専用および非表示のプロパティでファイルを開くことができます.
 
2.ファイルを閉じる
ファイルを開く使用後は必ず閉じる、outなどのclose関数を呼び出すことで実現できます.close();
3.ファイルの読み書き
前述した挿入器(<>)でファイルから読み込むことができます
たとえば
ofstream out;
ifstream in;
out << "hello";//ファイルに「hello」と入力
string s;
in >> s;//ファイルから文字列を読み込む
 
例:
#include
#include
using namespace std;

int main()
{
    ofstream ou;            //       
    ifstream in;            //       
    ou.open("C:\\test.txt", ios::app);        //           
    if(ou.is_open())                          //      
    {
        cout << "open success" << endl;
        ou << "hello " << endl;                //       hello
    }
    else
        cout << "open failed" << endl;
    ou.close();

    in.open("C:\\test.txt");        //         
    if(!in)                         //        
        cout << "open failed" <> ch;                        //        ,        ,       
    in.close();                       //    
    cout << ch << endl;
    return 0;
}

 
二つ目はfopen関数によってファイルを開く方法です
FILE *fopen(const char* path, const char* mode);
必要なライブラリ:
戻り値:ファイルが正常に開くと、ストリームを指すファイルポインタが返されます.ファイルのオープンに失敗した場合はNULLを返し、errnoにエラーコードを保存します.
パラメータの説明:
path:開くファイルのパスとファイル名です.
mode:代表フロー形態
modeには以下のような形態があります
rファイルを読み取り専用で開き、存在する必要がある
r+は、存在する必要があるファイルを読み取り可能に開く
rb+読み書きはバイナリファイルを開き、データの読み書きのみを許可する
rt+読み書きテキストファイルを開く
w書き込み専用ファイルを開き、ファイルが存在する場合はファイル長が0になり、そのファイル内容が消失し、ファイルが存在しない場合はそのファイルを作成する
w+書き込み専用ファイルを開き、ファイルが存在する場合はファイル長が0になります.つまり、ファイルの内容が消え、ファイルが存在しない場合はファイルが作成されます.
aファイルのみを追加で開きます.ファイルが存在しない場合はファイルが作成され、ファイルが存在する場合はファイルの末尾にデータが書き込まれます.(EOF符号保持)
a+ファイルのみを追加で開きます.ファイルが存在しない場合はファイルが作成され、ファイルが存在する場合はファイルの末尾にデータが書き込まれます.(EOF符号は保持しない)
wbは新しいバイナリファイルを開くか確立するだけを書く
wb+読み取りと書き込みでバイナリファイルを開くか作成し、読み取りと書き込みを許可
wt+読み書きオープンまたはテキストファイルを作成し、読み書きを許可
at+読み書きテキストファイルを開き、読み書きまたはテキスト末にデータを追加できます.
ab+読み書きバイナリファイルを開き、読み書きやテキスト末にデータを追加できます.
#include 
#include 
#include 
using namespace std;

int main()
{
    FILE *fp;
    fp = fopen("C:\\test.txt", "r");       //  

    if(fp == NULL) 
   {
        cout << "error" << endl;
        exit(1);
    }

    char ch;
    while((ch = getc(fp)) != EOF)        //    
        cout << ch << endl;
    fclose(fp);                    //    
    return 0;
}

3フォルダの下にあるすべてのファイルを読み込み、使用_finddata_t構造体
必要なヘッダファイルは
_finddata_tの定義は以下の通りである
struct _finddata_t
        {
             unsigned attrib;
             time_t time_create;
             time_t time_access;
             time_t time_write;
             _fsize_t size;
             char name[_MAX_FNAME];
        };

構造変更体の各メンバーの変数の意味は次のとおりです.
 
 
unsigned atrrib:ファイル属性の格納場所.ファイルのプロパティを表すunsignedユニットが格納されます.ファイルのプロパティはビットで表されます.主に以下のものがあります.A_ARCH(アーカイブ),_A_HIDDEN(非表示),_A_NORMAL(通常),_A_RDONLY(読み取り専用),_A_SUBDIR(フォルダ),_A_SYSTEM(システム)といったように,ここで定義されたマクロであり,そのまま使用することができるが,本来の意味は符号なしの整数型である(ただし、この整数は2の数回のべき乗であるべきであり、1ビットのみが1であり、他のビットは0であることが保証される).ビット表現である以上、1つのファイルに複数の属性がある場合、ビットまたは方式によって、いくつかの属性の統合が得られることが多い.例えば、読み取り専用+非表示+システム属性は、_A_HIDDEN|_A_RDONLY|_A_SYSTEMであるべきである.
time_t time_create:ここのtime_tは変数タイプで、実際には長い整形変数long intであり、1970年1月1日0時0分0秒から現在時刻までの秒数を保存するために使用される.
time_t time_アクセス:ファイルが最後にアクセスされた時間.
time_t time_write:ファイルが最後に変更された時間.
_fsize_t size:ファイルのサイズ(バイト数表示).
char name[_MAX_FNAME]:ファイルのファイル名.ここの_MAX_FNAMEは、ファイル名の最大長を表すヘッダファイルで定義される定数マクロです.
どのようにこの構造体を使ってファイルの情報をその構造体のメモリ空間に格納することができますか?findfirst()、_findnext()、および_fineclose()の3つの関数を組み合わせて使用します.次に、この3つの関数について説明します.
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
戻り値:検索に成功すると、long型の一意の検索用ハンドルが返されます.このハンドルは_findnext関数で使用されます.失敗は0を返します.
パラメータ:
filespec:ファイルを表す文字列で、ワイルドカードをサポートします.例:*.cは、現在のフォルダの下にあるすべての接尾辞がCのファイルを表す.
fileinfo:ここではファイル情報を格納するための構造体のポインタです.この構造体は、この関数を呼び出す前に宣言する必要がありますが、初期化する必要はありません.メモリ領域が割り当てられている限りです.関数が成功すると、関数は見つけたファイルの情報をこの構造体が割り当てたメモリ空間に格納します.
int _findnext( long handle, struct _finddata_t *fileinfo );
戻り値:0が正常に返された場合、-1が返されます.
パラメータ:
handle:即由_findfirst関数は、戻ってきたハンドルを返します.
fileinfo:ファイル情報構造体のポインタ.ファイルが見つかったら、関数はファイル情報をこの構造体に挿入します.
int _findclose( long handle );
戻り値:0が正常に返され、-1が失敗しました.
パラメータ:
          handle :_findfirst関数は、戻ってきたハンドルを返します.
この構造体と組み合わせた関数で使用される論理は、まず_findfirstは最初のファイルを検索し、成功すると返されたハンドルで_を呼び出します.findnext関数は他のファイルを検索し、検索が完了したら使用します.findclose関数は検索を終了します.
例:最近自分で書いた小さな項目
ここで私の考えでは、フォルダの下のすべてのファイル名を1つのコンテナで保存し、上記の2つの方法の1つでアクセスすればいいと思います.コードは主要な部分を示しています.
#include 
#include 
#include 
using namespace std;
void findFile(string path, vector &res)
{
    string p;
    long hFile = 0;                //    
    struct _finddata_t fileinfo;    //    
    //            ,          
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != 0)
    {
        do
        {
            string path_s = p.assign(path).append("\\").append(fileinfo.name);
            res.push_back(path_s);            //    
        }
        while(_findnext(hFile, &filename) != -1);
        _findclose(hFile);    //    
    }
}

int main()
{
    string path = "C:\\Users\\Desktop\\test"        //        
    vectorres;
    findFile(path,res);                   //          ,      
    。                                //          ,    
    。
    。
}