C言語でデータの種類ごとにディレクトリーを用意し、データを振り分けたいのですが。。
 fopenすると同じディレクトリーでしかファイルを呼び出したり、保存したりしかできないですよね。ちがうディレクトリーのファイルの呼び出し、ファイルの保存は出来ないでしょうか?また、ディレクトリーの作成なんてことは、C言語ではできないでしょうか?
 誰か知っている人がいましたら、よろしくお願いします。

このQ&Aに関連する最新のQ&A

種類 言語」に関するQ&A: 言語の種類

A 回答 (2件)

ディレクトリの作成は「_mkdir」と言う関数が用意されています。


Cのヘルプで「_mkdir」をキーワードに検索してみて下さい。

fopenは同じディレクトリでしか操作できない
・・・と言うのがちょっと分からないんですが、
fopen("dir1\\file.txt", "w")とすれば、
exeファイルと同じディレクトリに存在する「dir1」フォルダの中に
「file.txt」と言う名前のファイルを作成します。
また、fopen("../data.dat", "w")とすれば、
exeファイルの一つ上のディレクトリに
「data.dat」と言う名前のファイルを作成します。

もちろん、絶対パスを使う事も出来ます。
例)fopen("C:\\dir1\\dir2\\sample.ini", "w")

質問の回答になっているかどうか分かりませんが、
こんなのでどうでしょう?
    • good
    • 0
この回答へのお礼

>また、fopen("../data.dat", "w")とすれば、
exeファイルの一つ上のディレクトリに
「data.dat」と言う名前のファイルを作成します。

もちろん、絶対パスを使う事も出来ます。
例)fopen("C:\\dir1\\dir2\\sample.ini", "w")

こういう使い方を知らなかったので。。
非常に助かります。ありがとうございました。

お礼日時:2001/07/27 10:50

sueokaさんの回答のとおりですが、一応、UNIX版だと以下のとおりです。



「ディレクトリ作成」
mkdir("作りたいディレクトリ名");

「ファイルオープン」
FILE fp;
fp = fopen("ファイル名","r"); /* 読み込みの場合 */

質問内容を見ますと、絶対パス、相対パスをよく理解されていないのでは?と思いました。念のため書いておきます。

●絶対パス:ディレクトリの先頭(UNIXならルート、Windowsならドライブ)から最後まで全部書く方法

●相対パス:実行ファイルと同じディレクトリを基準にする方法(正確にはカレントディレクトリを基準にします。カレントは変更可能)。1つ上のディレクトリを示すには、 ../ と書きます。
例)実行ファイルの1つ上のabcというディレクトリのdef.txtを追加モードでオープンする。
fp = fopen("../abc/def.txt","a");

補足は以上です。がんばってください!
    • good
    • 0
この回答へのお礼

 >fp = fopen("ファイル名","r"); /* 読み込みの場合 */
ファイル名のところは、ファイル名しか入れられないのかと思っていたので、
>fp = fopen("../abc/def.txt","a");
このような使い方ができるとは知りませんでした。
ありがとうございました。ポイントはどちらにも、多くやりたいのですが、そうもいかないので、早いもの順ってことで。ありがとうございました。

お礼日時:2001/07/27 10:53

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

このQ&Aと関連する良く見られている質問

Q[c言語] fopenでの追記

c言語についてです。

すでにあるテキストファイルに追記したい場合、ファイルの一番下の行から追記されてしまうのですが、
最初から追記ができるようにするにはどうすればいいのですか。


FILE *fin=fopen=("hoge.log","a");

FILE *fin=fopen=("hoge.log","a+");
で開いてます。
( rewind(fin)は無理でした。 )

よろしくお願い致します。

Aベストアンサー

C言語ライブラリのfopenは
・新規作成して上書き(古い内容は消える)
・末尾から追記(古い内容の続きに書く)
のどちらかしか出来ません。

残念ながら
・既存ファイルの先頭や途中への挿入
は出来ないのです。

もし「先頭に1行挿入したい」のなら

1.作業用の別のファイルを新規作成する。
2.まず、挿入したい行を1行、1.で新規作成したファイルに書く
3.既存ファイルを「読込モード」で開いて、1行読む
4.読んだ1行を、1.で新規作成したファイルに書く
5.既存ファイルがEOFになるまで、3~4を繰り返す
6.両方のファイルを閉じる
7.既存ファイルを削除する
8.最初に新規作成したファイルのファイル名を、削除した既存ファイルのファイル名にリネームする。

というような面倒な処理が必要になります。

QC言語からのFortranプログラムの呼び出し

Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したいのですが,具体的にどのようなコードを記述すればいいのかがわかりません.お教えいただけないでしょうか.
サブルーチンinputおよびoutputでは入力および結果ファイルの入出力を行っています.
当方C言語はほぼ初心者です.Fortranのプログラミング環境としてはVisualStudio2005およびVisualFortran9.1を用いています.
C言語のプログラミング環境としてはおなじくVisualStudio2005を使用したいとおもっております.

[メインプログラム]
open (5,file='input.dat')
open (6,file='output.dat') /入出力用のファイルを開く
call input(parameter1) /各サブルーチンで有限要素法を実行
call bound(parameter2)
call matrix(parameter3)
call solve(parameter4)
call output(parameter5)
close (5) /入出力用のファイルを閉じる
close (6)
stop
end

Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したいのですが,具体的にどのようなコードを記述すればいいのかがわかりません.お教えいただけないでしょうか.
サブルーチンinputおよびoutputでは入力および結果ファイルの入出力を行っています.
当方C言語はほぼ初心者です.Fortranのプログラミング環境としてはVisualStudio2005およびVisualFortran9.1を用いています.
C言語のプログラミング環境としてはおなじくVisualStudio2005を使用したいとおもっております.

[メイ...続きを読む

Aベストアンサー

「Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したい」ということですが, 見た感じではその Fortran プログラムはそれだけで完全なプログラムになっているので, 必要なデータをファイルに保存しておいて, しかる後に別プロセスとして実行すればいいだけではないでしょうか.
system か ShellExecute か, そのあたり?

QC言語 ポインタ型引数の呼び出しについて

C言語 ポインタ型引数の呼び出しについて

私が作成したのではないのですが下記のような関数があります。
この関数は文字列を渡すとカンマ(,)で分割して返してくれる関数
らしいのですが、使用方法がわからず、こまっています。

char* abcdef(char** p)

当方としては下記のような変数定義を行っているのですが
char cbuff[128];//文字列(カンマを含めた)
char *coutbuff[128];//分割された文字列

理想としてはこんな感じで呼び出したいのですが

strcpy(cbuff,"0,,123,45,6");
coutbuff=abcdef(cbuff);


どのように呼び出したらよいかご教示願います。

Aベストアンサー

超えすぱーで回答するなら、
char* abcdef(char** p)という関数の型から、この関数は
文字列を渡すとカンマ(,)で分割して返してくれる関数ではなく、
文字列を「複数」渡すと、カンマ(,)区切り「の文字列」にして返してくれる関数
なのではないかと推測される。
が、あくまで予想に過ぎない。

コンパイルすればすぐに分かると思いますが、
char**型はchar*[128]型に直接代入できない。
よって、関数の型をchar**abcdef(char*)としても、
質問者の意図で、この関数を使用するには無理がある。

意図どおりに使用するためには、関数を
int abcdef( char*, char**, int )
もしくは void abcdef( char*, char**, int, int* )などに
する必要があると思われるが、他人が作った関数という時点で、
ソースが無ければどうにもならない。

なので、他の方が仰るように自分で意図する動きをする
関数を作るほうが早い。

とりあえず、どのように呼び出したらよいか知りたければ
関数の仕様・やりたいことを明確に提示してもらう以外に
方法はないと思います。
#「正しく」呼び出さなくてよいのならabcdef(NULL)でも。。。;)

超えすぱーで回答するなら、
char* abcdef(char** p)という関数の型から、この関数は
文字列を渡すとカンマ(,)で分割して返してくれる関数ではなく、
文字列を「複数」渡すと、カンマ(,)区切り「の文字列」にして返してくれる関数
なのではないかと推測される。
が、あくまで予想に過ぎない。

コンパイルすればすぐに分かると思いますが、
char**型はchar*[128]型に直接代入できない。
よって、関数の型をchar**abcdef(char*)としても、
質問者の意図で、この関数を使用するには無理がある。

意図どおりに使用す...続きを読む

Qプログラミング言語Cとプログラミング言語C++

プログラミング言語Cとプログラミング言語C++の違いって何ですか?
あと、プログラミング言語C++についていくつか質問があります。
#include <iostream>
using namespace std;
void main(){
cout << "Hello world!" << endl;
}
このプログラムについて質問なんですが、iostreamってプログラミング言語Cで言うstdio.hのことですか?
using namespace stdって何ですか?
あと、 cout <<"Hello world!"って何ですか?

Aベストアンサー

> プログラミング言語Cとプログラミング言語C++の違いって何ですか?

C++は、Cのほぼ全ての仕様を含み、クラス、テンプレート、例外処理など大幅に機能拡張した言語です。
細部の違いが知りたければ、下記を参照してください。
http://www.kijineko.co.jp/tech/cpp2c

> このプログラムについて質問なんですが、iostreamってプログラミング言語Cで言うstdio.hのことですか?

違います。
C++にもstdio.hがありますし、cstdioというヘッダもあります。

iostreamヘッダは、cin, cout, cerr, clogとそれらのワイド文字版を宣言するためのものです。
ですので、iostreamヘッダで宣言・定義される関数やクラスを使うだけでは一般的なファイルの操作はできませんし、sprintfやsscanfに相当するものもありません。
また、removeやrenameなど、ストリームとは関係のない操作も含まれていません。

> using namespace stdって何ですか?

「using指令」によって、名前空間stdの中にある名前を大域的名前空間でも使えるようにするものです。
せっかく名前空間を分けているのに、それを無効にしてしまうような機能ですから、安易にusing指令を使うのはお勧めしません。

> あと、 cout <<"Hello world!"って何ですか?

標準出力に対して、文字列"Hello, world!"を出力します。
ちなみに、endlは、改行を出力したあと、バッファにたまった内容を実際に吐き出します(フラッシュします)。単なる改行の出力ではないので要注意です。

C++の仕様は結構大きい方なので、遭遇した記述をひとつひとつ質問していたのではキリがありません。
まずは入門書を一冊読み、わからない用語等については、処理系のリファレンスを読むか、ネットで検索するなどしてください。

> プログラミング言語Cとプログラミング言語C++の違いって何ですか?

C++は、Cのほぼ全ての仕様を含み、クラス、テンプレート、例外処理など大幅に機能拡張した言語です。
細部の違いが知りたければ、下記を参照してください。
http://www.kijineko.co.jp/tech/cpp2c

> このプログラムについて質問なんですが、iostreamってプログラミング言語Cで言うstdio.hのことですか?

違います。
C++にもstdio.hがありますし、cstdioというヘッダもあります。

iostreamヘッダは、cin, cout, cerr, clogとそれらのワイド...続きを読む

Qfopenで開いたファイルのサイズを取得したい

おはようございます。
Javaはそれなりに経験があるのですが、Cの経験は皆無に等しいものです。

FILE *fp;
fp = fopen("C:\hoge.txt","r");
if(::GetFileSize(fp,NULL)>1000000){
ログをバックアップに格納し、新しいファイルを作る;
}

としたところ、ファイルの中身が空でもif文の中を通るようになってしまいました。
ファイルサイズがうまくとれていないようなのですが、どこに原因があるのでしょうか。
クイックウォッチをしようしても中の値が見れません。。。。。
環境はMicrosoft Visual Studio .NET 2003 + WinXPです。
よろしくお願いいたします。

Aベストアンサー

ご質問の内容のプログラムでGetFileSizeは使えません。GetFileSizeを使用する場合、第一引数はCreateFileなどのAPIで取得できるファイルハンドルを使用します。

fopenの場合、ファイルディスクリプタですので、feof、fread、fseekなどを使用して、同様の機能を実現する必要があります。


このカテゴリの人気Q&Aランキング

おすすめ情報