dポイントプレゼントキャンペーン実施中!

c++でファイル操作について学習しています。

結論から申しますとファイルやディレクトリ操作のときの「/」と「\」の違いは何でしょうか?

以下の写真のような環境だったとします。
全て四角で分かりにくいと思いますが。text1は通常のテキストファイルです。
main.cppでtext1の内容を読み込もうとしました。

ifstream fin(".\text_folder\text1") とやるとエラーとなり
ifstream fin("./text_folder/text1") とやるとエラーになりませんでした。

例えばコマンドを打つときにも
cd A\text_folder
cd A/text_foldfer
で行けるのに今回のファイル操作ではなぜエラーが起きたのでしょうか?

「c++ ファイル操作について」の質問画像

A 回答 (3件)

C だと \t は「水平タブ文字」を表すから


".\text_folder\text1"
という文字列リテラルは
.「水平タブ」ext_folder「水平タブ」ext1
と解釈される. つまり, そういう名前のファイルがあればよかったわけだし, 今回のエラーはそういう名前のファイルを作らなかったあなたの落ち度 (え?) なわけだ.

以下小ネタ.
Windows/DOS の「内部のパス解析ルーチン」では「/」と「\」を同等に扱っている. ただし「/」をコマンドプロンプト (command.com) のオプション指定に使っていたため, コマンドプロンプトで「/」をパスの区切りに使おうとすると「オプション」と解釈されて問題を生じることがある (逆にいえば, そこを潜り抜ければ「/」と「\」は全く同等に使える). そしてこの「コマンドプロンプトにおけるオプション指定文字」を変えるシステムコールもあったのだが MS-DOS 3.30 あたりで消された. これには「Microsoft の陰謀説」もあるぞ.
    • good
    • 1

> 結論から申しますとファイルやディレクトリ操作のときの「/」と「\」の違いは何でしょうか?



ぶっちゃけ、「OSの違い」です。
元々、Cが生まれたUNIX上だと、ファイル・ディレクトリのパス上の区切り文字は/です。そういう風に設計されています。
一方、WindowsはDOSの時からの伝統でファイル・ディレクトリのパス上の区切り文字は\になっています。
と言うわけで、「UNIXで生まれたC言語をWindowsで使う際にWindowsのディレクトリをどないして表現すんねん」って話が出てきたわけですよね。何故なら、C言語は設計上、UNIXと親和性があるように設計されていて、\はエスケープ文字を表現する為に使われてる。

例えば、WindowsでC系の言語でProgram Files (x86)とか言うフォルダを参照する時どうすんだ、とか(笑)。これ、多分誰もが一回はハマる話ですよねぇ。UNIXだとそもそもデフォルトでは、フォルダ名にスペースを含む事はありませんが、Windowsだとそれがある。ふっつーにC言語で作ったプログラムから端末にProgram Files (x86)にある何かにアクセスしろ、って場合、困っちゃうんですよね。
一つはパス名を完全に文字列にすれば、賢いDOS窓が「パス名だね!」って判断してくれるテクニック。
もう一つが

C:\\Program\ Files\ (x86)\\hoge.exe

とエスケープ文字\を駆使して記述する方法ですね。昔Windows使ってた時、「何でこんなん書かなアカンの?」となってパニックになりました(笑)。今はもっとDOS窓とかPower Shellとか賢くなってるんで、違ってるかもしれませんが(プログラミング言語によっては、UNIX式の表現を「Windows/DOSのパス表記だ」と判断してくれるブツもあります)。
いずれにせよ、「スペースは名前のウチの一つなんだ」ってぇんで、「\ 」と言うのでスペースを表現して、とか言うクソッタレな事を行わないといけなかったのです。

ちなみに、どんな言語でもエスケープ文字は\なのか、ってぇとそんなこたぁありません。CやCをルーツに設計された言語だと「遠からずUNIXの影響を受けていて」そうなってるだけに過ぎません。
例えば、ANSI Common Lispと言うプログラミング言語だと、エスケープ文字は~(チルダ)が受け持っています。だからWindows上でパスを書く際に、Cで見られるような面倒はありません。
    • good
    • 1
この回答へのお礼

歴史までありがとうございます

お礼日時:2020/08/21 15:52

C++に限らず、C言語でも文字列の中の「\」はエスケープ文字としてファイルパスを区切る「/」のような意味になりません。


もし「/」と同じ意味を持たせたい場合は、「\\」のように2つ並べて指定します。
    • good
    • 0
この回答へのお礼

あ!そう言う事なんですね。
ありがとうございます。

お礼日時:2020/08/21 07:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!