自分のお店を開く時の心構えとは? >>

Cからxmlファイルを開きたいのですが、VC++でビルドして実行すると、
どうしてもファイルをオープンしてくれません。

なにか特別な設定でもあるのでしょうか。

ちなみにxml ファイルのプロパティは、読み取り専用にチェック入れない、
アーカイブ可能にするにチェック入れて、このファイルに対し、プロパティ
だけでなくコンテンツにもインデックスをつける にチェックいれております。

宜しくお願いします。

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

A 回答 (3件)

>sprintf(filename, "Result%d.xml", i);


>fp = fopen((const char *)filename, "r");

お約束なアレですが…
実行時の「カレントディレクトリ」にファイルあるんですよね?
「カレントディレクトリってなぁに?」って言うのなら、まず検索してください。
# お約束ってくらい、よくひっかかる人が多いんですけどね。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/05/16 04:57

fopenがNULLを返したときのerrnoの値は何ですか。

この回答への補足

エラーコード2番ですね。

補足日時:2014/05/16 05:05
    • good
    • 0
この回答へのお礼

有難うございました。

お礼日時:2014/05/16 04:59

どんなコードを書いて、どういう結果(コンパイルエラー、または関数の結果がエラーになった)になったかがわかれば力になれるかもしれません。

この回答への補足

下記のようなコードです。ファイル名は
Result0.xml です。(0から16)

///////////////////////////////////
// 1商品の出品店ごとの価格の取得 //
///////////////////////////////////
int get_price(){
char filename[15];
char buf[size];
char dest[5]; // 何ページ目かを入れる文字配列

char *tmp1;
char *token1=NULL; // 作業用
char *token2=NULL;
char *token3=NULL;
char *token4=NULL;
char *token5=NULL;
char *token6=NULL;
char *token7=NULL;
//char *token8=NULL;

int i, j, k, l=0;
int price = 0; // 価格
int rec_num = 0; // レコード件数

long sum = 0; // 総合計金額

float average = 0; // 平均価格

FILE *fp=NULL;

bool flag=true; // 商品ID切り替わりフラグ

//////////////////////
// ファイルオープン //
//////////////////////
for(i=0; i<16; i++){
sprintf(filename, "Result%d.xml", i);
fp = fopen((const char *)filename, "r"); // Cではブロックの最初で変数宣言しないとダメ
if(fp==NULL){
printf("ファイルのオープンに失敗しました");
return -1;
}

補足日時:2014/05/16 02:42
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/05/16 02:36

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QC言語から呼び出し可能なXMLパーサについて

このたび、XMLで記述されたファイルを読み込んで、
特定のデータのみを取り出すことになりました。
それで、XMLパーサを使用してそれを実現しようかと
思っています。C言語から呼び出し可能なXMLパーサがあれば、教えていただけませんでしょうか。(有償でも無償でもかまいません。実行時のOSはSparc系solarisですが、linux,windowsで使用可能なものでもかまいません。参考にしたいと思っています)
JAVAからの呼び出し可能なものであれば、あるようですが、C言語から呼びさせるものは、検索しても見あたりませんでした。

Aベストアンサー

Cでのparserでは eXpat が有名。DOM-parserではありませんが。

参考URL:http://expat.sourceforge.net/

Qsocket: recvはいつ,どれだけ受け取るのか?

 現在,参考書にしたがってC++でソケットプログラミングを書いています.

 sendとrecvを非同期にするために,本では select関数やWSAAsyncSelect関数などを利用していて,実際,本のとおりに書いて上手く動いています.

 ここで伺いたいのですが,recvは,どうやって「データが届いたか」を知るのでしょうか.

 同期ならば,トランシーバでの会話のように送信側が「どうぞ」といって送受信を交代させることができますが,非同期ならばそれができません.

 NICとかが,プログラムに「届いたぞ!( or これから届くぞ!)」と教えてくれるのでしょうか.あるいは逆に,プログラムがNICに「届いてる?」と聞いているのでしょうか.仮に,ここに書いたような方法で届いたことが分かったとしても,どれくらい受け取ればいいかは分かりません(それも併せて教えてもらっているのでしょうか.データを送るときには,どれだけ送ればいいか分かりますよね.受信するときはどうしてるのかを知りたいと思っています).

Aベストアンサー

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満たされると、この場合は select() や read() が、抜けてくる(return する)訳です。

という事で、ユーザのプログラムは select() なり read() なりで受信データを「待つ」ことが必要です。もちろん select() や read() が呼ばれた時点で既に受信しているのならば、それらは直ぐに帰ってきます。read() や recv() はデータが届いた事を知る、というよりは、届いているかチェックして、まだ届いていなければ届くまで待つ(read() が抜けてこない)という処理になります。また NIC とユーザプログラムが直接やり取りをするのではなく、間にバッファがあって、対応するソケットのデータがある(受信済み)/ないか(未受信)、という問い合わせを行っているだけです。

ソケットの場合、データの送受信は非同期であり、送受信のタイミングのずれは(ソケット)バッファである程度吸収されます。もちろん、送受信バッファが満杯になった場合は流量制御が働いて、結果的に送信側の write() や send() が待ちに入ることになります。

Linux (Unix) のソケットの受信では、read() 等で指定されたバッファが常に満杯で返されるとは限らない設計になっています。つまり、その時に受信しているデータを返すだけなので、read() で返されたバイト数を必ず見ないと間違った動きになるので注意してください。

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満...続きを読む

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む


人気Q&Aランキング

おすすめ情報