web-dev-qa-db-ja.com

Windowsで絶対パスを指定して、fopenでファイルを開く

ファイルの行数をカウントするプログラムを作成しようとしています。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;
}

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

13
franvergara66

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

"C:\\Documents and Settings\\juegos psps.txt"
20
SingerOfTheFall

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

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

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

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

バックスラッシュの正しいエスケープシーケンスは二重のバックスラッシュなので、次のように記述する必要があります。

archivo = fopen("C:\\Documents and Settings\\juegos psps.txt","r");
6
Jon

windowsとLinuxでも動作します:/バックスラッシュをエスケープする代わりに\\

"C:/dir1/dir2/file.ext"
3
Preexo

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

試してください:

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

1
Greg S

コードブロックフォルダーに新しいフォルダーを作成する

メインとヘッダーファイルの横にあるプロジェクトフォルダーに新しいファイル「exemple1」を作成し、ファイルを「file.txt」に入れます。

string nom_fichier;
nom_fichier = "exemple1/file.txt" ;
fichier = fopen(nom_fichier.c_str(), "r+");
0
Athimni Iheb