Ç言語初心者です。visualstudio2010を使用しています。

ファイルサイズ100MBのtest.binをバイナリモードで開き、10GBになるまで0を追加するプログラムを組みたいと思います。
ファイルを読み込んで出力するようには組めたのですが、この手法だとファイルサイズが大きいと時間がかかってしまいます。

現在のソースは以下の様になっているのですが、どうしたらもっと早く終わらせることが出来るでしょうか?
また、int型でファイルサイズを取得していますが、ファイルサイズがもっと大きくなったときにint型では足りなくなってしまうのもどうすればいいのか困っています。
※元ファイルサイズ(test.bin)は例としています。今後?GBサイズになると思います。変更後のファイルサイズは今後10GBくらいまでで考えています。

#include <stdio.h>
#include <string.h>
#include "stdafx.h"

#define KIRO (1024)
#define MEGA (KIRO*1024)
#define GIGA (MEGA*1024)
#define SIZE (100)

int main(void)
{
FILE *fp,*fpw;
unsigned char c;
unsigned char zero = 0;
int i = 0;
int filesize;

// 元ファイルをバイナリモードで開く
fp = fopen( "test.bin", "rb" );
if( fp == NULL )
{
printf( "test.binが開けません" );
return 1;
}

fseek( fp, 0, SEEK_END );
filesize = ftell( fp );
fseek( fp, 0, SEEK_SET );

// 書込み先をバイナリモードで開く
fpw = fopen( "test_W.bin", "wb" );
if( fp == NULL )
{
printf( "test_W.binが開けません" );
return 1;
}

while(1)
{
i++;
// 指定サイズになったら終了
if(i > MEGA * SIZE) break;

// ファイルサイズまで読み書き
if(filesize < i){
// 残りを0で代入
fwrite(&zero, sizeof(unsigned char), 1, fpw);/* 1文字ずつ書き込み */
}else{
// ファイルの内容を1文字ずつ読み書き
fread( &c, sizeof(unsigned char), 1, fp );/* 1文字ずつ読み込み */
fwrite(&c, sizeof(unsigned char), 1, fpw);/* 1文字ずつ書き込み */
}
printf( "%d番目\n", i );
}

printf( "\n" );

fclose(fp);
fclose(fpw);

return 0;
}

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

A 回答 (5件)

アルゴリズムを替えてみましょう。




基本的に方向性を示しただけですから、エラー処理等は
 別途考慮してください。


1. test.binをtest_W.binにコピーする。
※ 色々方法は有りますが例えば、
Win32のCopyFile関数でコピーする。

CopyFile( "test.bin", "test_W.bin", TRUE又はFALSE );

リファレンスはググるか、MSDN等で調べてください。

2. test_W.binをオープンし、ファイル末尾までシークする。

3. ファイルサイズが10GB未満の間、ゼロを追加する。
※ 1MB程度のバッファを用意してゼロクリアしておき
MB単位でストリームに書き込んだほうが良いでしょう。(w)

4. test_W.binをクローズする。


かなり早くなると思いますよ。

以上です。

この回答への補足

回答有り難うございます。

回答頂いたことを参考に組みなおしてみたいと思います。

補足日時:2011/04/16 18:37
    • good
    • 0

おっと, よく見たら「Ç言語」なのか. そんな言語, はじめて聞いた....

    • good
    • 0

まずどこに時間がかかっているのかをきちんと把握する必要はあるな.


まあ #2 で言われているように, 「printf をなくす」と速くなることは確実. ただ, 「10 GB のファイルを作る」となると必然的に時間はかかるので「ある程度」であきらめざるをえない.

あと, fread の返り値を使えばわざわざファイルサイズを調べておく必要はなくなるし, ループが簡単になるので結果的に (ちょっとだけ) 速くなるはず.

この回答への補足

回答有り難うございます。
ご指摘いただいた点を参考に見直させていただきます。

補足日時:2011/04/16 18:35
    • good
    • 0

>printf( "%d番目\n", i );


>printf( "\n" );

このあたりのprintf関数の呼び出しは、実行時間を増大させるもとです。
思い切ってカットしてみてはどうでしょう。

ループについては、今のままでもいいし、別の回答者さんが書かれているような方法でもいいです。
同じ結果を得るためのコードは何通りもあるっていうだけです。
    • good
    • 0

・ファイルサイズに64bitの型を使う


・1文字ずつではなく、ある程度まとめて読み書きする。

> while(1)
> {
> i++;
> // 指定サイズになったら終了
> if(i > MEGA * SIZE) break;

わざわざ無限ループ+breakなんてことしないで、普通にforとか whileの中で判定とかすればいいんじゃないですか?

この回答への補足

回答ありがとうございます。

無限ループにしたところに意味はなかったのですが、処理スピードに違いが出るのでしょうか?
まとめて読み書きすることも考えたのですが、変更後のファイルサイズを小さい単位で指定する時に不便が生じるのではないかと思い1文字ずつ読み込むことにしました。

補足日時:2011/04/15 19:58
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Q復元ポイントの作成とイメージファイル等のバックアップとの違いについて

今晩は、宜しくお願いします。

復元ポイントの作成とイメージファイル等のバックアップとの違いについて教えて下さい。

Windowsで復元ポイントからシステムを復元させる方法があり、
また、イメージファイル等にバックアップをとり、復元させる方法もありますが
この両者はどのように違うのでしょうか。

復元ポイントの作成とは、その時点のシステムの設定等だけを保存しているという
ことでしょうか。

また、イメージファイル等のバックアップを作成するということは
システム設定と作成したファイル等もイメージファイルとして一括してバックアップ
されるのでしょうか。

イメージファイルの復元時に、作成したファイル等もイメージファイルから
復元されるのなら、同じ名前のファイルがあった場合には、
イメージファイル作成時の古い情報のファイルになってしまうのでしょうか。

以上、宜しくお願いします。

Aベストアンサー

【システムの復元】
Windowsが使用するシステムファイルのバックアップと復元。
ユーザーファイルには影響しない。
HDDの中に作成されるので、Windowsが起動しない環境では使用出来ない。

【システム修復ディスクの作成】
Windowsの起動時にF8を押下して起動するセーフモードから「コンピューターの修復」「システム回復オプション」を、外部記憶装置(CD、USBメモリなど)から起動出来るようにする。
Windows自体が起動しなくなった場合に、外部記憶装置から「システム回復オプション」が起動出来るようになる。修復されるのは、選択した項目により異なる。
WindowsREを利用。
https://msdn.microsoft.com/ja-jp/library/hh825173.aspx

【バックアップと復元】
システムのバックアップを作成し、ハードディスクなどが壊れた場合に備えパソコン内部のデータを全てバックアップ・復元出来る。
Windowsのインストールディスクや、システム修復ディスクから復元が可能。
システムもユーザーデータもバックアップを取った時点の状態に戻る。

【システムの復元】
Windowsが使用するシステムファイルのバックアップと復元。
ユーザーファイルには影響しない。
HDDの中に作成されるので、Windowsが起動しない環境では使用出来ない。

【システム修復ディスクの作成】
Windowsの起動時にF8を押下して起動するセーフモードから「コンピューターの修復」「システム回復オプション」を、外部記憶装置(CD、USBメモリなど)から起動出来るようにする。
Windows自体が起動しなくなった場合に、外部記憶装置から「システム回復オプション」が起動出来るようになる。...続きを読む

QVisualStudioでのプログラム勉強(初心者)

数ヶ月前、プログラミングに興味を持ち、いろいろ調べてみてC++言語を習得したいと思いVisualStudio .NETを購入しました。
しかしいろいろといそがしく、特に何もできずに今に至ったのですが、夏休みということもあり、じっくりとプログラミング学習に打ち込めそうです。
書籍は「Cの絵本」「C++の絵本」というものをVisualStudio購入に合わせて買ったので、そこに載っていた本当に基本的なことは理解しているつもりです。
当面の目標はMFCを使ったGUIのプログラムを作ることができるようになることなのですが、どのようなことをしたらよいのか分かりません。
そのようなことが解説されているサイトをご存知の方、教えてください。
もしくは、アドバイスをお願いします。

プログラミングの経験はなく、HTMLくらいです。

Aベストアンサー

MFCから入るのも悪くは無いですが、究極のC++言語の使い方をいきなり目の当たりにすることになりますから、ステップバイステップではないので、試行錯誤の連続に堪えられるかがポイントとなるでしょう。
GUIのプログラムから入るのは、C++言語を覚える目的であれば、オススメしません。表示や入力といった、C++言語以外の要素が多いからです。
例えばウイザードを使えば誰にでも簡単にMFCを使ったGUIアプリが出来ますが、C++言語習得が目的なら、そんなことをしても意味がありません。
C++文献の殆どはC言語の経験者が対象なので、C言語の経験が無いと厳しいでしょうから、C言語から始めるのがオススメです。
オススメサイトは、「猫でもわかる」で検索してみてください。
C++でオススメの本のISBNは、4873110637 です。
ただ、プログラミングの経験が無いのであれば、敷居が比較的低いVBから入ってみるのも良いかもしれません。

Q救出ファイル復元 2の機能について

「救出ファイル復元 2」で画像ファイルJPEGの他にRAWファイル、拡張子(CR2)を復元出来るでしょうか。

キャノンの一眼デジカメを使っているのですが、他の復元ソフトでは、復元出来ませんでした。

Aベストアンサー

Vectorあたりで『ディスク・ファイル復旧』の項目で探せばみつかりそうですが。
要は,"復元ソフトで復元できるファイルがソフトに登録されている拡張子だけしかできない"ことですので,拡張子を選択できる復元ソフトを捜せばいいと思われます。

参考URL:http://www.vector.co.jp/vpack/filearea/win/util/disk/care/

QC言語の初心者の中の初心者です

フリーのコンパイラをとったのですが、バッチ、ファイルとして認識されまえせんとか指定されたファイルが見つかりませんと表示されます。どこからダウンロードしたのか忘れてしまいましたが、インターネットソース名はcmdとなってます。
Microsoft windows XP[Version5.1.2600]
(C)Copyright 1985-2001 Microsoft corp.
C:\Documents and settings\yuki>
上のプログラムが表示されてるのですが >のあとに何と打ち込めばいいのでしょう?yukiはこのパソコンに入れた名前です。#include <stdio.h>
        main()
{
printf("abcde\n");
}
などと入力してみましたがファイルが見つからないとか出てしまいました。何か必要なプログラムがあるのでしょうか?

Aベストアンサー

C言語の前に先ずはコンパイラって何、という知識はあった方が良いですね。
とりあえずGNUプロジェクトのCygwinを入れてみてはどうでしょうか?
CygwinとはWindows上でUNIXコマンドが利用できるソフトで、
gccというコンパイラもインストールオプションで入れる事が出来ます。
インストール後は、Cygwinコンソール上から、
$ gcc hogehoge.c
でコンパイルが出来ますよ。
またわからない事がありましたら、補足で質問してください。

参考URL:http://cygwin.com/

Q削除した画像ファイルの取り出しまたは復元方法

ごみ箱に入れてから削除したファイルの復元方法を教えてください。

以前にも同様の質問をしたのですが、その際に教えていただいた方法で確かにいくつかのファイルは復元することができました。

しかし、一番復元したい画像ファイル(jpeg形式)が復元できません、同時期に同じく削除したファイルは無事に取り出せたのですが肝心のファイルは取り出せません。指定するファイル名、フォルダ名などの間違いはないのですが何が原因で復元できないのか理解できません。

良きアドバイスをいただければ助かります。
宜しくお願いいたします。

Aベストアンサー

こういったファイル復元ソフトを利用してファイルを復活させます。

●FileRecovery(フリーウェア)

消去・欠損したファイルを復元するソフト。
http://www.pcinspector.de/download.htm

●復元(フリーウェア)
http://www.vector.co.jp/soft/win95/util/se192983.html

■FINALDATA(ファイナルデータ)フォトリカバリー3.0(有料)
http://www.finaldata.ne.jp/f_8_3.html

当然ながら復元できる確立は有料ソフトのほうが高いです。

これらを使っても復元できない場合はファイルが上書きされて完全に消えている可能性が高いです。

QC言語、初心者が書けそうなプログラムとは?

 はじめにお断りしますが、私はプログラマーになるつもりは全くないです。
 それとプログラムの知識もほとんど全くありません。
 純粋に興味として質問をさせていただきます。

以下はC言語の入門者用の目次からなのですが、
----------------------------
if,switch,for,while
2次元配列、自作関数、ポインタ、
関数への・コマンドプロンプトでの引数の渡し方
ファイルへの読み込み・書き出し
バイナリファイルの入出力
構造体、共用体と列挙体、マクロ、
複数ファイルのプログラム
malloc関数
----------------------------

(1)以上のもの+α程度を習得して、さらに人の助言などによって発展性をもたらすことができたら、具体的に(※)何のプログラムが自作できますか?
(※)カレンダー、オセロゲーム など??

(2)C言語を扱うプログラマーとして会社に入社して、最初の1年目で任せられるようなプログラムとは具体的にどういうものがありますか?

 特に(2)の質問は範囲が広すぎて回答が困難だと予想されますが、質問している私自身が何もわからない人間なので、質問の範囲を狭めることができません。申し訳ありませんが上手く答えられる方、お願いします。

 はじめにお断りしますが、私はプログラマーになるつもりは全くないです。
 それとプログラムの知識もほとんど全くありません。
 純粋に興味として質問をさせていただきます。

以下はC言語の入門者用の目次からなのですが、
----------------------------
if,switch,for,while
2次元配列、自作関数、ポインタ、
関数への・コマンドプロンプトでの引数の渡し方
ファイルへの読み込み・書き出し
バイナリファイルの入出力
構造体、共用体と列挙体、マクロ、
複数ファイルのプログラム
malloc関数
...続きを読む

Aベストアンサー

こんばんは。

(1)
他の方の回答にもあるように、すべて基礎です。

C言語はあらゆる分野で活用されていますが、これを、C言語の基本を「学習する」ということをベースに考えると、コマンドプロンプト上で動く「住所録」というところがひとつの到達点になると思います。

 ・新規登録
 ・一覧表示
 ・編集
 ・削除
 ・保存
 ・CSVファイルからの読み込み
 ・CSVファイルへの書き込み

Windows で動くものを作ろうと思ったら、もっといろんなことを勉強する必要がありますし、Cじゃないほうが簡単です。


(2)
私は業務エンジニアリングを主とするベンダとお付き合いがあるフリーランスのシステムエンジニアですが、C言語を学んで入ってくる新人がいないので、非常に重宝すると思います。ただし、私が今いる分野だと、Cを使うことがあまりない!

業務エンジニアリングの分野では、半年は仕事の流れを勉強することになるでしょう。成果に応じて、先輩が作ったプログラムのテストをしたり、簡単なバッチプログラム(たとえば、上であげたCSVファイルからの読み書きとか)を書いてもらうと思います。そこで、ちゃんとポインタがわかってるかとか、Cのわかりにくいスコープを理解しているかとかを見極めて、1機能を任せるようにします。


こんなんでいいですかね?
 
 
 

こんばんは。

(1)
他の方の回答にもあるように、すべて基礎です。

C言語はあらゆる分野で活用されていますが、これを、C言語の基本を「学習する」ということをベースに考えると、コマンドプロンプト上で動く「住所録」というところがひとつの到達点になると思います。

 ・新規登録
 ・一覧表示
 ・編集
 ・削除
 ・保存
 ・CSVファイルからの読み込み
 ・CSVファイルへの書き込み

Windows で動くものを作ろうと思ったら、もっといろんなことを勉強する必要がありますし、Cじゃないほう...続きを読む

Q「ウイルス感染ファイル」削除後のシステム復元でどうなる?

ウイルスバスターで幾つかのウイルス感染ファイル発見し全て削除しましたが、感染したファイルはシステムファイルでしたので少し心配でしたが削除しました。
そこで教えて頂きたいのですが、感染した日付以前でシステムの復元をする事によって削除されたシステムファイルは復元できるのでしょうか?一度削除されたシステムファイルはシステムの復元をしても二度と復元しないのでしょうか?

Aベストアンサー

以下WindowsXPという前提で・・・

>システムファイルでしたので少し心配でしたが削除しました。
通常、このままではシステムエラーが発生します。
しかし、Windowsには自動復旧機能があり、削除されたファイルをハードディスク上にあるCabファイルから呼び出して復旧させるようになっています。
従って、殆どの場合、削除されたシステムファイルを手動でインストールする必要はありません。

☆SFCの実行
もしシステムエラーが出る場合SFC(System File Checker)の実行をお勧めします。

1.CDドライブにOSのインストールディスクを入れておく。
2.「スタート」「コマンドプロンプト」または「ファイル名を指定して実行」で
「sfc /scannow」と入力して「OK」

「Windows XP professional のディスクを入れてください」という表示が出ることがありますがHome Editionであれば「無視」を選んでスキップしてください

>感染した日付以前でシステムの復元をする事によって削除されたシステムファイルは復元できるのでしょうか?
出来ないことはないでしょうが、あまりお勧めできません。
現在の状態が正常でない。
過去の状態の方が快適に操作できる。
という場合、それがいいかもしれません。
しかし、Windowsの設定というのは非常に広範囲にわたっており、現在と過去を比較して、どちらが適正かを判断するのは容易ではありません。
また、過去の復元ポイントの中には不正な設定が含まれている場合があり、間違って、そのポイントを選択することもあります。
ウィルス対策ソフトのサイトでは一旦復元設定を無効にして、過去の復元ポイントを全て消去することを推奨しています。

>一度削除されたシステムファイルはシステムの復元をしても二度と復元しないのでしょうか?
間違った操作をすると汚染されたファイルが復元されてしまいます。
一旦復元設定を無効にして、過去の復元ポイントを全て消去することで汚染されたファイルは二度と復元しません。

以下WindowsXPという前提で・・・

>システムファイルでしたので少し心配でしたが削除しました。
通常、このままではシステムエラーが発生します。
しかし、Windowsには自動復旧機能があり、削除されたファイルをハードディスク上にあるCabファイルから呼び出して復旧させるようになっています。
従って、殆どの場合、削除されたシステムファイルを手動でインストールする必要はありません。

☆SFCの実行
もしシステムエラーが出る場合SFC(System File Checker)の実行をお勧めします。

1.CDドライ...続きを読む

QC言語初心者です。初心者がすぐに上達する本のおすすめありますか?

タイトルのとおりです。

仕事でCを使わなければなくなくなりそうです。
CはCでもいろいろありますよね。+とか++とか、クイックCとかどの辺りがちがうのでしょうか?

 基本的な質問ですが、まったくの初心者ですので、基礎から学びたいと思っています。

プログラム自体はベーシックやコボルの経験があるので、アルゴリズムは理解しているつもりですが、
はじめてのことなのでよくわかりません。

すばり、基礎から学べてすぐに上達するおすすめの本。
教えてください。

よろしくお願いします。

Aベストアンサー

まず、CとC++は別のものです。
建前上は「C++はCの上位互換」となっていますが、
プログラムの書き方は非常に違います。

学ぶならまずCを一通りやってからC++に行く方を薦めます。
Cですでにややこしい問題が出るので…。C++はさらにその上だし…。

まず、以下の本を買ってください。
「ANSI C/C++辞典」
平林 雅英 (著) 共立出版
http://www.amazon.co.jp/exec/obidos/ASIN/4320027973/
これは本当に買ってください。
もっともこれのC++部分はちょっと古く、
その意味では同じ著者のC言語だけの本
「新ANSI C言語辞典」でもいいかもしれません。
どっちかは必要です。

文法の入門書に関しては…私が昔勉強したのは、
多くが品切れになっているので、よくわかりません。
有名なのは、開発者が書いた「プログラミング言語C」(共立出版)ですが、
これはあまり読みやすくないと思います。持っていても損はないですが…。

初心者向けとしては、柴田望洋氏の本は定評があります。
http://www.amazon.co.jp/exec/obidos/ASIN/4797311517/

あと、ネット上にある「C言語FAQ」を
ときどき読むとよいでしょう。
Cの世界はいろいろややこしいことがあるとわかります。
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

参考URL:http://www.amazon.co.jp/exec/obidos/ASIN/4320027973/

まず、CとC++は別のものです。
建前上は「C++はCの上位互換」となっていますが、
プログラムの書き方は非常に違います。

学ぶならまずCを一通りやってからC++に行く方を薦めます。
Cですでにややこしい問題が出るので…。C++はさらにその上だし…。

まず、以下の本を買ってください。
「ANSI C/C++辞典」
平林 雅英 (著) 共立出版
http://www.amazon.co.jp/exec/obidos/ASIN/4320027973/
これは本当に買ってください。
もっともこれのC++部分はちょっと古く、
その意味では同じ...続きを読む

Q復元ソフトのふと感じた疑問 -ファイル名を削除したい-

先日、復元ソフトを使用していたときに感じたことなのですが
(使用ソフトは「復元」です。)
ファイルを復元する際の手順で削除したファイルが検索できますよね。
このファイル検索の時に、HITしないようにファイル名を完全に削除したい場合はどのようにすればいいのでしょうか??

例えば、「●●との秘密旅行001.jpg」のファイルを削除したとします。
その後、復元ソフトで検索をかけるとファイルを復元しなくてもファイル名を見ただけで怪しいファイルとわかってしまいますよね。
復元ソフトの検索で、表示されなくする方法か、別名に変える方法があるのなら教えてください。

Aベストアンサー

95159さんが求めていらっしゃるのは以下の方法ではないでしょうか。

フリーの復元ソフトに「DataRecovery」というものがあります。このフリーソフトには「削除したファイル」の名前を時間をかけず簡単に消去できる機能が付いています。

『DataRecovery』
http://www.vector.co.jp/soft/win95/util/se382922.html

■使い方
起動させる→該当ドライブをクリック→[スキャン]ボタンをクリック→削除したファイルの表示完了→「目的のファイルが見つかりましたか?」と出てきたら[キャンセル]をクリック→名前を消去したいファイルをクリックするか、名前を消去したい複数ファイルを左クリックしながら選択する→[消去]ボタンをクリック→[OK]をクリック

これで、名前を消せます。しかしながら完璧ではなくて、一部消せないこともあります。
(「DataRecovery」を再起動してもう一度ドライブをスキャンすると消せなかったファイルが表示されます)

参考URL:http://www.vector.co.jp/soft/win95/util/se382922.html

95159さんが求めていらっしゃるのは以下の方法ではないでしょうか。

フリーの復元ソフトに「DataRecovery」というものがあります。このフリーソフトには「削除したファイル」の名前を時間をかけず簡単に消去できる機能が付いています。

『DataRecovery』
http://www.vector.co.jp/soft/win95/util/se382922.html

■使い方
起動させる→該当ドライブをクリック→[スキャン]ボタンをクリック→削除したファイルの表示完了→「目的のファイルが見つかりましたか?」と出てきたら[キャンセル]をクリック→名...続きを読む

QC言語でのファイル操作について(初心者)

ファイル操作について教えてほしいのですが、
例えば、(極端な話ですが)

AさんがBさんに飴玉をあげたのが分かったら
ファイルにAさんとBさんの組を登録し、
Aさんのカウンタを1つ増やす。
そしてBさんがAさんにお返しに飴玉をあげたら
Aさんのカウンタを1つ減らす。
お返しをしなかったらAさんのカウンタは1のまま
というようなプログラムを作成したいんですが
どうやったらいいのかわかりません。誰か分かる人が
いらっしゃいましたらご教授お願いします。


if(AさんがBさんに飴玉をあげたのが分かったら) {

FILE *fp;
fp = fopen("filename", "a");
fprintf(fp, "A"); /* filenameというファイルにAとBの組を登録*/
fprintf(fp, " B\n");

---filenameの中---------------------

あげた人:A もらった人:B A=1


------------------------------------
というように計算しようとしています
お願いします。

ファイル操作について教えてほしいのですが、
例えば、(極端な話ですが)

AさんがBさんに飴玉をあげたのが分かったら
ファイルにAさんとBさんの組を登録し、
Aさんのカウンタを1つ増やす。
そしてBさんがAさんにお返しに飴玉をあげたら
Aさんのカウンタを1つ減らす。
お返しをしなかったらAさんのカウンタは1のまま
というようなプログラムを作成したいんですが
どうやったらいいのかわかりません。誰か分かる人が
いらっしゃいましたらご教授お願いします。


if(AさんがBさんに飴玉をあげたのが分...続きを読む

Aベストアンサー

まぁ書かれている仕様だけならこんな(↓)ところでしょうね

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#defineACTOR_SIZE100

#definetrue1
#definefalse0

#defineFILE_NAME"foo.txt"

typedefstruct _Actor {
charname;
intcnt;
} Actor;

intRegNo( char name, Actor actor[] ) {

inti;

for ( i = 0; i < ACTOR_SIZE; i++ ) {
if ( actor[i].name == 0 )break;
if ( actor[i].name == name)return i;
}

if ( i == ACTOR_SIZE )exit( 0 );

actor[i].name = name;
actor[i].cnt = 0;

return i;
}

intmain() {

Actoractor[ACTOR_SIZE];
charname;
intindex1, index2;
FILE*fp;

memset( actor, 0, sizeof( actor ) );

while( true ) {
printf( "あげた人:" );
name = getchar();
getchar();
index1 = RegNo( name, actor );
actor[index1].cnt++;

printf( "もらった人:" );
name = getchar();
getchar();
index2 = RegNo( name, actor );
actor[index2].cnt--;

fp = fopen( FILE_NAME, "a" );
if ( fp == NULL )exit( 0 );
fprintf( fp, "あげた人:%c もらった人:%c %c=%d\n",
actor[index1].name,
actor[index2].name,
actor[index1].name,
actor[index1].cnt );

fclose( fp );
}


return 0;
}

プログラム中の細かいエラーチェックなどは自分で付け足してください。

ただ仕様としては足りない所がまだあって、
・同一人物間の飴玉のやり取りは成立するのか
・カウンタのディフォルト値が無いので0にしたが、カウンタが0の人は飴玉が貰えるのか(そもそもこれが成り立たないとプログラムは開始できませんが…)
・名前の長さは良いとしても登場人物の人数制限は?

さらに書けば「ファイル操作について教えて欲しい」とありますが、ファイル操作の何が判らないのですか?

まぁ書かれている仕様だけならこんな(↓)ところでしょうね

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#defineACTOR_SIZE100

#definetrue1
#definefalse0

#defineFILE_NAME"foo.txt"

typedefstruct _Actor {
charname;
intcnt;
} Actor;

intRegNo( char name, Actor actor[] ) {

inti;

for ( i = 0; i < ACTOR_SIZE; i++ ) {
if ( actor[i].name == 0 )break;
if ( actor[i].name == name)return i;
}

if ( i == ACTOR_SIZE )exit( 0 );

actor[i].name =...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング