C言語で分からない部分がいくつかあります。
長文になります。
市のデータ(cities.txt)を対象として、以下の各機能を持ったプログラムを作成しました。
1.情報の登録と一覧表示
2.情報の削除
3.cities.txt からの情報の読み込み
4.citiesDB.txtへのリスト内容の書き出し
5.人口でソート
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLEN 32
#define BUF_LEN 128
#define CITYDB_R_FILE "cities.txt" // 読み込み用ファイル
#define CITYDB_W_FILE "citiesDB.txt" // 書き出し用ファイル
struct cities{
char pref[STRLEN];
char city[STRLEN];
int popl;
float area;
float dens;
char founded[STRLEN];
struct cities *next;
};
struct cities *root=NULL; // rootへのポインタは大域変数として定義
void *mymalloc(size_t sz){
void *p = (void *)malloc(sz);
if(p == NULL){
fprintf(stderr,"ERR: Can't malloc memory %d bytes.",(int)sz);
exit(1);
}
memset(p,0,sz);
return p;
}
void showCity(struct cities *c, FILE *fp){
fprintf(fp,"%s\t%s\t%d\t%.2f\t%.2f\t%s\n",
c->pref, c->city, c->popl, c->area, c->dens, c->founded);
}
struct cities *genNewCityCell(char *pref, char *city, int popl, float area, float dens, char *founded ){
struct cities *c;
c = mymalloc(sizeof(struct cities));
// メモリを確保した c に対して、値を代入する
return c;
}
void showList(FILE *fp){
struct cities *cur= root;
while(cur != NULL){
showCity(cur,fp);
cur = cur->next;
}
}
void saveList(){
// 書き込み用のファイルを開き、そのファイルポインタ fp に対して、
// showList(fp) を呼ぶ。 void showList() は12行上で定義している
printf("File saved to %s\n",CITYDB_W_FILE);
}
struct cities *line2City(char *buf){
struct cities *c=NULL;
int popl;
char pref[STRLEN], city[STRLEN], founded[STRLEN];
float area, dens;
sscanf(buf, "%s %s %d %f %f %s", pref, city, &popl, &area, &dens, founded);
c = genNewCityCell(pref,city,popl,area,dens,founded);
return c;
}
void addCity(struct cities *c){
struct cities **cur= &root;
/*
rootから順にたどって,末尾に挿入する
*/
}
void inputStr(char *buf,int len){
fgets(buf,len,stdin);
buf[strlen(buf)-1]='\0';
}
void addNewCity(){
char buf[BUF_LEN] = "";
struct cities *c;
while(strlen(buf)<=0){
printf("Input one line:\n");
inputStr(buf, BUF_LEN);
}
if(strncmp(buf, "Prefecture", 10) == 0) return;
c = line2City(buf);
addCity(c);
}
void deleteCityFromList(char *delcity){
/*
順にたどり,当該項目を削除する.
addCity() も同様.
*/
}
void deleteCity(){
char buf[STRLEN];
showList(stdout);
printf("Select Delete City Name:");
inputStr(buf, STRLEN);
deleteCityFromList(buf);
}
void readListFILE(FILE *fp){
char buf[BUF_LEN];
struct cities *c;
while( fgets(buf,BUF_LEN,fp) != NULL){
if(strncmp(buf, "Prefecture", 10) == 0) continue;
c = line2City(buf);
if(c != NULL) addCity(c);
}
}
void readList(){
/*
ファイルCITYDB_R_FILEを読み取り用で開く
ファイルが開けない場合のエラー処理
readListFILE(fp);
ファイルをクローズ
*/
printf("File loaded\n");
}
void insertCityByPopl(struct cities *sc){
struct cities **cur= &root;
/*
順にたどり、挿入すべき箇所に sc を挿入
*/
}
void sortList(){
struct cities *cur,*fr;
cur = root;
root = NULL;
while(cur != NULL){
insertCityByPopl(genNewCityCell(cur->pref, cur->city, cur->popl, cur->area, cur->dens, cur->founded));
fr = cur;
cur = cur->next;
free(fr);
}
showList(stdout);
}
int main(int argc, char *argv[]){
char buf[BUF_LEN];
while(1){
printf("Menu(a:add, d:delete, l:list, s:sort, w:write file, r:read file q:quit):\n");
fgets(buf,BUF_LEN,stdin);
switch(buf[0]){
case 'a':
addNewCity();
break;
case 'd':
deleteCity();
break;
case 'l':
showList(stdout);
break;
case 's':
sortList();
break;
case 'w':
saveList();
break;
case 'r':
readList();
break;
case 'q':
exit(0);
break;
}
}
}
ただ、コメントのある部分の関数が完成できません・・・・
どなたか教えてください。
お礼
sakusaker7 さん できました!ありがとうございました。 コントロールパネルの「ウィンドウの色とデザイン」で、 指定する部分(I):を「メニュー」 フォント(F):を「MS UI Gothic」にすると問題のダンプは出なくなりました。 さらに、別の方に教えて頂いたのですが、 もともとの PV = 0x3d0d9e4 "\203\201\203C\203\212\203I 9"\0 [UTF8 "\x{c1}C\x{c3}C\x{ca}\x{283}\x{c9}I 9"] の部分の文字コードを次のようにprintすると・・・ >perl -e "print \"\203\201\203C\203\212\203I 9\"" メイリオ 9 と出ていたようです。 それで、次は、メイリオのままにしておいて、 ダンプが出なくなる方法について興味が湧くところではあります。 'perl' 'meiryo'とかで検索してみて、次のようなページを見つけました。 http://magicant.txt-nifty.com/main/2010/08/windows-7-6332.html こちらを参考にしてみようと思います。 (でも、perl 5.8. ではそもそも無理なのかも知れませんね) とにかく、次のヒントとなるキーワードにもたどり着けるようになれました。 重ね重ね、ご回答ありがとうございました。
補足
sakusaker7 さん ご回答ありがとうございます。拝見いたしました。 今、GWの休暇に入ってしまい、少しお時間いただきますが、 ご指定の内容のうち、フォント変更の方法を試してみようと思います。 結果が分かり次第、ご回答としてあらためてご報告させて頂きます。 ありがとうございました。