1

私はこれを理解しようとしていますが、長い間私を悩ませています。

私が入力したとき:

inFile.open("C:\Users\Mark\Desktop\text.txt", ios::in | ios:: binary);

それはうまく動作します。しかし、私がこのようなことをするとき。

string garbage = "\\";

        srcLoc = ofn.lpstrFile; // this is: C:\Users\Mark\Desktop\text.txt

        // This for loop inserts "\\"
        for(int i = 0; i < srcLoc.length(); i++)
        {
            switch(srcLoc[i])
            {
            case '\\':
                srcLoc.insert(i, garbage);
                i++;
                break;
            }
        }
       // Now string srcLoc looks like: C:\\Users\Mark\\Desktop\\text.txt
        inFile.open(srcLoc.c_str(), ios::in | ios:: binary);
       // But it wont work

        if(inFile)
        {
            while(!inFile.eof())
            {
                getline(inFile, tekst);
                SendMessage(hTextBox, EM_REPLACESEL, 0, (LPARAM)tekst.c_str());
                SendMessage(hTextBox, EM_REPLACESEL, 0, (LPARAM)"\r\n");
            }
        }
        else
        {
            MessageBox(0, srcLoc.c_str(), "Could not load", MB_ICONWARNING | MB_OK);
        }
        inFile.close();

私が得たのは、MessageBoxの「ロードできませんでした」が少なくとも機能していることです:)誰かが私が欠けているものを知っていますか?

4

2 に答える 2

6

ソース コードの文字列でバックスラッシュを使用する場合は、バックスラッシュを 2 つにする必要があります。コンパイラは、ソース コード内の各二重バックスラッシュを、プログラムで使用される文字列内の単一のソース コードに変換します。実行時に入ってくる文字列を読み取る場合、バックスラッシュを 2 つにする必要はありません。

于 2012-03-28T18:33:47.003 に答える
1
// Now string srcLoc looks like: C:\\Users\Mark\\Desktop\\text.txt

これは、デバッガー (またはランタイム中の他の場所) で文字列がどのように見えるかではありません。これは、バックスラッシュを含む文字列がソース コードで表現される唯一の方法です。

余分なものを追加しようとするループ'\'も機能しません。コンパイラが単一のバックスラッシュを削除し、エスケープ シーケンスに対応する値がある場合はそれらを置き換えるためです。たとえば、シーケンス'\t'はタブ文字に置き換えられます。

代わりに代替パスセパレーターを使用して問題を解決できます

"C:/Users/Mark/Desktop/text.txt"

これは、Linux だけでなく、Windows でも機能します。

于 2012-03-28T19:43:02.237 に答える