13

ファイルの行数をカウントするプログラムを作成しようとしています.fopen関数に絶対パスを渡そうとすると、単に見つからないことがわかります.ここに私のコードがあります:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
    int i=0;
    char array[100];

        char caracteres[100];
        FILE *archivo;
        archivo = fopen("C:\Documents and Settings\juegos psps.txt","r");
        if (archivo == NULL){cout<<"Dont Work";}
        while (feof(archivo) == 0)
        {
                fgets(caracteres,100,archivo);
                i++;
                }
                cout << "Number of lines:" << i ;
                return 0;
}

ファイルを開くことができるように、プログラムに絶対パスを渡すにはどうすればよいですか?

4

6 に答える 6

21

二重スラッシュを使用します。

"C:\\Documents and Settings\\juegos psps.txt"
于 2012-07-13T07:39:46.680 に答える
7

コンパイラはリテラル文字列内のバックスラッシュを次の文字と一緒に調べ、通常はそれらを 1 つの文字として解釈するため、機能していません。文字列リテラル内のこのような 2 文字のシーケンスは、エスケープ シーケンスと呼ばれます。

シーケンス\D\jは何にもマップされません (\n改行文字にマップされるこれとは対照的です)。この場合、標準では、コンパイラが選択したとおりにそれらを解釈できると述べています。一部のコンパイラは、バックスラッシュを無視することを選択します。これは、あなたの場合、同等の結果になります:

archivo = fopen("C:Documents and Settingsjuegos psps.txt","r");

(この名前のファイルを作成して、これがコンパイラの動作であるかどうかをテストできます)。

バックスラッシュの正しいエスケープ シーケンスは 2 つのバックスラッシュなので、次のように記述します。

archivo = fopen("C:\\Documents and Settings\\juegos psps.txt","r");
于 2012-07-13T07:45:08.347 に答える
3

Windows と Linux でも同様に機能します:/バックスラッシュをエスケープする代わりに\\

"C:/dir1/dir2/file.ext"
于 2014-01-31T17:34:50.183 に答える
1

ファイル名のスペースを確認してください。スラッシュは適切にエスケープされましたが、空白はエスケープされませんでした。

試す:

fopen("C:\\\\Documents\ and\ Settings\\\juegos psps.txt","r")

于 2013-02-09T21:55:22.343 に答える
-1

すべてのコードとパスが正しく入力されている場合、fopen が機能しない原因として考えられるもう 1 つの理由は、[プロジェクト プロパティ] -> [C/C++ コード生成] -> [ランタイム ライブラリ] がデバッグ ビルドの /MDd ではなく /MD に設定されている可能性があります。プロジェクト構成に対応し、XX から Release XX(d) から Debug

于 2015-10-08T02:03:25.230 に答える