質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%

Q&A

解決済

1回答

665閲覧

ファイルの中のファイルを開きたい C言語

varmosy

総合スコア4

0グッド

0クリップ

投稿2024/01/20 18:59

編集2024/01/21 01:38

実現したいこと

zipファイル"Q2 (2).zip"の中にファイル"Q2"があり、その中にテキストファイル(01.txt, 02.txt, ...)があます。各ファイル(01.txt, 02.txt, ...)には50個くらいの数値が書かれています。

各ファイルにおいて数値の平均値、最大値、最小値を表示させ、どのファイルでその平均値、最大値、最小値が導出されたのかわかるようにoutput.txtに書き込むプログラムを作成したいです。

発生している問題・分からないこと

ファイルQ2を開くことができません。これはソースコードを実行すると"ファイルオープンに失敗しました2。"が表示されることからわかりました。
・ファイル「Q2」内にあるテキストファイル(01.txtなど)を開き、平均値などを計算するプログラムを書いたつもりなのですが、テキストファイルを開くことができません。これはソースコードを実行すると"ファイルオープンに失敗しました3。"が表示されることからわかりました。

C言語初心者なのでお手柔らかにお願いします。

該当のソースコード

#include <stdio.h> int main(){ FILE *f1, *f2, *f3, *f4, *f5; double max=0.0, min=0.0, sum=0.0; double temp, ave; int i,j=0; char fname[10]; f1=fopen("./Q2", "r"); f2=fopen("./output.txt", "w"); if(f1==NULL){ printf("ファイルオープンに失敗しました1。\n"); return 1; }else if(f2==NULL){ printf("ファイルオープンに失敗しました2。\n"); return 1; } f3=fopen("./01.txt", "r"); if(f3==NULL){ printf("ファイルオープンに失敗しました3。\n"); return 1; } fclose(f3); for(i=0; i<=9; i++){ if(i<9){ sprintf(fname, "0%d.txt", i+1); }else{ sprintf(fname, "%d.txt", i+1); } printf("%s\n", fname); f4=fopen("fname", "r"); if(f4==NULL){ printf("ファイルオープンに失敗しました4。\n"); return 1; }else{ while( fscanf(f4, "%lf" , &temp) == 1 ) { if(max<=temp){ max=temp; }else if(temp<=min){ min=temp; } sum=sum+temp; j++; } ave=sum/j; fprintf(f2, "ファイル%s中の数値の最大値は%lf,最小値は%lf,\n平均値は%lfです。\n", fname, max, min, ave); } fclose(f4); } fclose(f1); fclose(f2); fclose(f3); return 0; }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

「ファイルの中のファイルを開く方法」などで調べましたがいいものがヒットせず、途方に暮れています。

また、zipファイルではなく、普通のファイル(Q2)の中のファイル(01.txtなど)を読み込むのも試しましたが、同様に上手く動作しませんでした。(※質問内容訂正のため削除)

補足

ファイル名が連番になっているので、このサイトを参考にしてファイル名の検索および読み込みを行うようプログラムしました。

Q2 (2).zipファイルを添付したいのですが、やり方がわからないのでファイルの場所をスクショしたものを添付いたします。
イメージ説明

[修正および補足内容]
・ソースコードおよび「発生している問題・わからないこと」を修正いたしました。
・これは学校の課題で、課題文を一部抜粋いたしますと、「以下の圧縮ファイル(zip形式)内にある連番となっているテキストファイル内の数値データ(実数)を読み込み...」となっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2024/01/20 19:29

C言語でzipファイルの展開をしたいという質問でしょうか? それには例えば、zlib(https://www.zlib.net/)を使用します。 「C zlib」で検索すると、解説しているページが多数あります。
dameo

2024/01/20 20:43

zipはファイルフォーマットの1種であり、1つのファイルです。複数のファイルやフォルダを圧縮してアーカイブすることが出来ます。Windowsのエクスプローラなどはそのzipファイルをあたかもフォルダのように見せていますが、現実には1ファイルでしかありません。 なので、C言語のプログラムからはzipであっても1つのファイルと同様にしか扱えません。なのでファイルの途中からzipストリームを伸長して開くことはできません。C言語のプログラムからzipファイルを扱う例は以下にありますので、参考にしてください。 https://www.geeksforgeeks.org/c-program-to-read-and-print-all-files-from-a-zip-file/ なお、zlibはzipストリーム自体を扱うことはできます(zipファイルの中の1ファイルのバイト列が特定できれば圧縮/伸長が出来る)が、アーカイブ(複数のファイルやフォルダを1つのファイルにまとめる)機能まではなかったかもしれません。
thkana

2024/01/20 22:30

> C言語初心者なので 「C言語」についていくら調べても解決には至らないでしょう。 足りないとすればzipファイルとは、そもそもファイルとは何か/どうやってその仕組みを実現するのかというあたりの理解かと思いますのでその辺調べてみては。 このお題でそこまで踏み込むのか、と言われるとちょっと考えてしまいますが、敢えてC言語を選ぶのならそこまで踏み込んでほしい、とも思ったり。
jimbe

2024/01/20 23:18 編集

teratail にバイナリファイルを載せる方法はありませんので、他のサービスを利用してそこへのリンクを張るようにしてください。 Q2(2) は zip として、 Q2 も何かのアーカイブだろうと想像は付きますがそれが分からないとプログラムになりません。 Q2 は何なのかを確認してください。 深読みしますと、 zip そのままで中のファイルを使用するプログラムを作れというのは初心者向けではありません。 課題の対象として配られた Q2.zip ファイルを手動で展開して、出てきたファイル群(01.txt等)をプログラムのフォルダにコピーして言われた処理をしろということなのではないでしょうか。 それを、何かの間違いで Q2.zip を更にアーカイブして Q2(2).zip が出来てしまい、かつ zip のまま使わなければならないと勘違いしているように思われます。 本当に zip をそのまま使うのか、それとも手動で展開して使うのかを出題者に確認しては如何でしょうか。 ちなみに、 zip を手動で展開することになって zip に関する処理をしなくて済んだとしても、各ファイルを処理する部分が間違っていますので、即完成とはならないでしょう。
melian

2024/01/21 00:36

> 各ファイルにおいて数値の平均値、最大値、最小値を表示させ、どのファイルでその平均値、最大値、最小値が導出されたのかわかるようにoutput.txtに書き込むプログラムを作成したいです。 C プログラム内で Zip ファイルを取り扱う必要はなく、Windows の機能を利用して展開しておけばよいかと思います。例えば、質問欄に貼られている画像の右上に「すべて展開」というアイコンがあるので、それをクリックすればよいでしょう。もしくは、以下のページを参考にして Zip ファイルを展開してもよいかと。 富士通Q&A - [Windows 11] ファイルを圧縮する方法と展開する方法を教えてください。 https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=4311-3347 ※ このページの「圧縮されたファイルを展開する場合」という項目
ikedas

2024/01/21 00:46

> 各ファイルにおいて数値の平均値、最大値、最小値を表示させ、どのファイルでその平均値、最大値、最小値が導出されたのかわかるようにoutput.txtに書き込むプログラムを作成 というテーマは、ご自分で考えられたものでしょうか、あるいは誰かから与えられた課題なのでしょうか。差し支えなければ、ご質問に至った背景を説明いただけないでしょうか。 というのも、このテーマ自体はかなり高度な内容を含むため、もしも他の方から出された課題ならばその人の指導の下で学習を進めないと解決できないと思われるからです。 --- ちなみに、 「zipファイル"Q2 (2).zip"の中にファイル"Q2"があり」というのは、ZIPアーカイブファイル「Q2 (2).zip」の中に「Q2」というディレクトリの情報が格納されており、他のファイルはこのディレクトリ配下のファイルとして格納されている、という意味だと思います。 C言語のfopen()では、ディスク上のファイルそのものしか開けません。今回ですとQ2 (2).zipを開くことはできますが、その中に格納されているディレクトリの情報や、個々のファイルを開くことはできないです。それにはZIPアーカイブファイルの内部構造についての知識に基づく別の方法が必要です。
varmosy

2024/01/21 01:38

皆様コメントありがとうございます。コメント数が多くて今熟読しているところです。 質問を修正して補足欄および質問内容にも補足・修正いたしましたが、ここにもコメントの質問に対する回答および質問を掲示いたします。 ・これお題は学校の課題です。3日ほど試行錯誤していたのですが解決できなかったので質問させていただきました。 ・課題文を一部抜粋いたしますと、「以下の圧縮ファイル(zip形式)内にある連番となっているテキストファイル内の数値データ(実数)を読み込み...」となっています。 ・今までに出された課題の傾向と皆様のコメントから考えると、「zip形式のファイルを開いてその中身のファイル(Q2)も開く」というのは現実的でない、もしくは解釈違いのような気がしています。 ・上記から、このお題については「ファイル内にある複数のテキストファイルを開いて各テキストファイルにおいて平均値、最大値、最小値を計算する」というようなお題に変更したいと思います。 また、このお題に沿ったソースコードに修正いたしましたが、テキストファイルを開くことができず上手く動作しないので、よろしければコメントまたは回答をよろしくお願いします。 ・このzipファイルを別サービスを利用して閲覧できるようにしたほうがよいでしょうか? もしそうならばお手数おかけいたしますが、コメントよろしくお願いします。
thkana

2024/01/21 01:50

もしかして、フォルダあるいはディレクトリのこともファイルと呼んでる?
ikedas

2024/01/21 02:40 編集

一般に学校の課題というのは、それまでの授業で学んだことを理解しているかどうかを確認するために出されるものです。 ZIPアーカイブファイル内のファイルの内容を取り出して処理するなどというニッチなテーマを、しかもC言語で記述するとなると、相当の前提知識が要求されます (プロのプログラマでも、前提知識から調べなおさないとプログラミングできません)。それらのヒントが授業の中で提示されていなかったはずがありません。 つまり、質問さんが課題のプログラムを書けないのは質問者さんが授業を理解してなかったからではないかと考えられます。 学校の課題についての質問は、教員の方にして下さい。当サイトは授業を理解していない (そもそも授業出てないのかもしれない) 学生の尻拭いをするための場所ではありません。
jimbe

2024/01/21 04:36 編集

結局 zip は手動で展開することにしたのですね。 それで、Q2(2).zip にあった Q2 は zip だったのでしょうか、それともフォルダだったのでしょうか。 つまり、作ったプログラムから見て処理すべきテキストファイル、例えば 01.txt は ./01.txt でしょうか、それとも ./Q2/01.txt でしょうか。 また、テキストファイルなら内容を(プログラムコードと同じように)質問に書けるはずですから、1つ位はサンプルとして提示頂いたほうが良いかと思います。
ikedas

2024/01/21 06:21

> 結局 zip は手動で展開することにしたのですね。 あっ本当だ。質問文に取り消し線が入ってますね。ZIPファイルは展開して使えばよいという情報をどこからかキャッチしたようですね。 で、「Q2」という「ファイル」を「開く」という件ですが、もしかすると、入力ファイルを課題の設問ごとに別のディレクトリに分けたものをまとめてアーカイブして配布しているだけなんじゃないかな。 つまり、ファイルを各々のサブディレクトリに入れたまま扱わなければならないといった要件も、もともとないんじゃないかな。 ことによると、これまで授業中に解いた演習問題でも、入力データを同様の方法 (ZIPアーカイブを展開する、設問毎のディレクトリから取り出して使う) で扱ってきたんじゃないのかなあ。だとすると、年度末も近い今回の課題では、配布したZIPファイルをどうやって扱うかなんていう説明は今さらしないかもね。 だとすると、質問者さんがそういった説明を聞いたことがないということは……。 やはり、学校の課題は、学校で勉強して解決して下さい。部外者に尻拭いさせるのはやめて。
varmosy

2024/01/21 12:42

コメントありがとうございます。 このお題についてなのですが、「フォルダQ2の中身の各テキストファイルを読み込む」ではなく「あらかじめ自分でフォルダQ2の中身のテキストファイル(01.txtなど)を開く」が正しい課題文の解釈っぽく、後者だとエラーなく動いたのでこの質問はここで打ち切りにしたいと思います。 自分の浅はかな知識のせいでお騒がせいたしました。今後はプログラミング関連の勉学により一層励みたいと思います。 最後に、各コメントについて返信させていただきます。 >フォルダあるいはディレクトリのこともファイルと呼んでいる? すいません、これを読むまでファイル以外にもフォルダやディレクトリという物があるのを知らず、すべてファイルと呼んでいました、申し訳ございません。勉強不足です。 >授業を理解していなかった... 自分的には授業はちゃんと出席しましたし、理解もできていたつもりなのですが、そのように不快におもわれたのであれば、謝罪いたします。申し訳ございませんでした。 >Q2はzipだったのでしょうか、... Q2はフォルダで、中にテキストファイル(01.textなど)が格納されていました。 テキストファイルには、一行ごとに数値が入力されています。 混乱させてしまい、誠に申し訳ございませんでした。 最後に、本当にお騒がせいたしました。申し訳ございませんでした。
jimbe

2024/01/21 13:31

>エラーなく動いたのでこの質問はここで打ち切りにしたい 動作したんですね。 teratail では打ち切りというのはありませんで、解決したのでしたら回答からベストアンサーを選ぶことで「解決」となります。 今の所回答は書かれていませんので、ご自身で(どのようなことで解決としたのかの)回答を書いてベストアンサーとしてください。
thkana

2024/01/21 14:35

> ファイル以外にもフォルダやディレクトリという物があるのを知らず 意外とそういう人は少なくないみたいで、他でもそういう方に出会ったことはあります。「ファイル」というのが「紙をたくさん綴じ込む文具」で(少なくとも日本では。海外ではどうなんでしょ?)、フォルダのアイコンで示されるものだったりするあたりから来る誤解でしょうか。 でも、とても不思議なのはそれで「理解もできていたつもり」になってしまうくらいに授業では通用していた、ということです...授業ではどのように習っているのでしょうか? ファイルとフォルダ/ディレクトリを混同していたら授業でも大混乱になりそうに思うのですが。
ikedas

2024/01/22 12:06 編集

質問者に対して 「授業料を払っているのだから学校の人に質問するのが当たり前だ。お金をかけているのにこんな無料サイトで質問していたら親が泣くよ」(大意) との コメントを投稿したところ、削除されました。 削除された理由は不明ですが、もしもteratailでは学校での専門教育よりも高度な内容を無料で提供できるということなら、素晴らしいことですので大歓迎です。 また同じコメントでは、teratailのヘルプを示して「ここはあなたの宿題を手伝う場ではない」との趣旨も述べましたが、そのような場所に変わったのならアナウンスをお願いします。宿題の手伝いをしたくてうずうずしている方々が参加を控えていたらもったいないです。
dameo

2024/01/22 12:16

削除に関与はしていませんが、単に質問内容と無関係だったので削除されたんだと思いますよ。相手(質問者さん)の意思をもっと尊重しましょう。あなたの下僕ではありません。
ikedas

2024/01/22 12:25

学生が宿題を手伝わせるためのサイトではないのだがら、質問してくる時点でサイトの趣旨と無関係な質問です。それを指摘するなといわれても。
dameo

2024/01/22 12:29

あなたに答えない自由があるのと同様に、学生さんにも質問する自由はあると思いますよ。 必要であれば別途ご自分で質問を立ててください(私は参加しませんが)。この質問とは無関係です。
ikedas

2024/01/22 12:35

質問することがサイトの趣旨に合わないと批判される自由もありますよね。 あなたが学生の持ち込んでくる宿題に対応してあげる自由もありますし、それを否定したことは少なくとも私はないですよ。
dameo

2024/01/22 12:59

繰り返します。「この質問とは無関係」なので「別途ご自分で質問を立ててください」
ikedas

2024/01/23 11:26 編集

質問者さんへ。 他の方からもすでに言われていますが、自分で解決したのなら「どのように解決したのか」を自分で回答として投稿し、この質問を解決ずみにして下さい。teratailのヘルプは読んでいますよね。 https://teratail.com/help#resolve-myself 学校の宿題は、今回の「ディレクトリ」のように授業で暗黙の前提になっていることが説明されなかったりします。学校の授業の中でしか正しい答えは得られないことが多いです。 何より、teratailに学校の宿題を聞きにくるような人は、しばしば、正解をもらうと質問をほったらかしていなくなります。礼さえ言えば何をしてもいいわけではありませんよ。 もう一度言います。自分で解決したのなら「どのように解決したのか」を自分で回答として投稿し、この質問を解決ずみにして下さい。
guest

回答1

0

自己解決

自分の課題文の解釈違いで、課題の解決もいたしました。
申し訳ございませんでした。

p.s.自分にも至らない点があったことは承知の上ですが、行動規範の「回答やコメントをする際は、相手を思いやって接することを心がけましょう。」に反するようなコメントがありとても怖かったです。

投稿2024/01/23 11:51

varmosy

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2024/01/23 14:03 編集

まずは、学校でしっかり勉強してください。先生にちゃんと質問できるようになることはとても大事です。 あなたの質問の不備についていろいろと指摘を受けたことを「怖かった」としか感じないのなら、あなたにはまだうまく質問できるだけの知的鍛錬が足りていないということです。 うまく質問できるように訓練することも、学校教育の重要な役割です。今は学校でよく学び、先生に質問し、いつか当サイトのような場で質問をする側ではなく、回答する側として参加してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問