ファイル読み込み
Posted: 2008年11月26日(水) 13:46
ちょっと教えていただきたいんやけどよろしいか??
ほな質問させていただきますよって。
下記のソースコードを見てほしいんやけど。。
今の段階でファイルの中身が
EKI="KANE"-"SAM"
KANE="SAM"%"EKI" だとします。これを読み込んで.hファイルに書き込んだ場合
#define KANE 0
#define SAM 0
#define EKI 0
#define EKI 0
#define KANE 0 となります。これを重複したものに関しては2度書き込まないようにしたいんやけど。。。
つまり.......
#define KANE 0
#define SAM 0
#define EKI 0 という結果にしたいと思ってるんやけど
どないしたらよろしいやろか??
みなはんお忙しいとは思いますが一つお力を貸していただきたい思います。どうぞよろしゅうたのんます。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1024
int main()
{
rightsidehfunction();
leftsidehfunction();
}
/* 左辺の値をとって.hファイルに書き込む関数 */
int leftsidehfunction()
{
FILE *ft;
FILE *fh;
char buf[MAX];
char *cPid[MAX]; // 採取したPID
char *cWorkRegiAdd; // 採取文字列作業域アドレス
char *cStoRegiAdd; // 文字列格納域アドレス
int n = 0;
int str = 0;
int k;
char *p;
ft = fopen("test.txt","r");
fh = fopen("test.h","a+");
if (fh == NULL || ft == NULL) {
printf("ファイルを開けません。\n");
return 1;
}
/* ファイルを1行ずつ読み込む処理 */
while (fgets(buf, sizeof buf, ft) != NULL){
cWorkRegiAdd = strtok(buf, "=");
for(k = 0;k < n;k++){
if(*cPid[k] != *cWorkRegiAdd)continue;
if(strcmp(cPid[k],cWorkRegiAdd) == 0)break;
}
if(k < n) continue;
cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1);
strcpy(cStoRegiAdd,cWorkRegiAdd);
cPid[n] = cStoRegiAdd;
fprintf(fh, "#define %s 0\n", cStoRegiAdd);
n++;
}
fclose(fh);
fclose(ft);
return 0;
}
/* 右辺の値をとって.hファイルに書き込む関数 */
int rightsidehfunction()
{
FILE *ft; // 入力ファイルポインタ
FILE *fh; // 出力ファイルポインタ
int c; //読み込み文字
char buf[MAX]; //バッファ領域
char buf1[MAX];
char cPid[MAX]; // 採取したPID
char *cWorkRegiAdd; // 採取文字列作業域アドレス
char *cStoRegiAdd; // 文字列格納域アドレス
char *cRegiTab[MAX]; // 文字列登録表
int iflag = 0; // 0/1; 右/左のクオート
int ichs = 0; // chrの文字数
int istr = 0; // strの文字数
int k; // ntrの探索index
int iOid; //OID
char *p;
ft = fopen("test.txt", "r");
fh = fopen("test.h", "w");
if (fh == NULL || ft == NULL) {
printf("ファイルを開けません。\n");
return 1;
}
//ファイルを1文字ずつ読み込む
while ((c = fgetc(ft)) != EOF) {
switch (c) {
case '"':
iflag = 1 - iflag;
/*右のクオート*/
if (iflag == 0) {
cPid[ichs] = '\0';
cWorkRegiAdd = cPid;
for(k = 0;k < istr;k++){
if(*cRegiTab[k] != *cWorkRegiAdd) continue;
if(strcmp(cRegiTab[k],cWorkRegiAdd) == 0) break;
}
if(k == istr){
cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1);
strcpy(cStoRegiAdd,cWorkRegiAdd);
cRegiTab[ist[/url] = cStoRegiAdd;
istr++;
fprintf(fh, "#define %s 0\n", cStoRegiAdd);
}
ichs = 0;
}
break;
case '\n':
if (iflag == 1) {
cPid[ichs] = '\0';
iflag = 0;
}
ichs = 0;
break;
default:
if (iflag == 1) {
cPid[ichs] = c;
if (ichs < MAX - 1) {
ichs++;
}
}
break;
}
}
/* ファイルの最後が改行じゃなかった場合 */
if (ichs>0) {
cPid[ichs]='\0';
}
fclose(ft);
fclose(fh);
return 0;
}
ほな質問させていただきますよって。
下記のソースコードを見てほしいんやけど。。
今の段階でファイルの中身が
EKI="KANE"-"SAM"
KANE="SAM"%"EKI" だとします。これを読み込んで.hファイルに書き込んだ場合
#define KANE 0
#define SAM 0
#define EKI 0
#define EKI 0
#define KANE 0 となります。これを重複したものに関しては2度書き込まないようにしたいんやけど。。。
つまり.......
#define KANE 0
#define SAM 0
#define EKI 0 という結果にしたいと思ってるんやけど
どないしたらよろしいやろか??
みなはんお忙しいとは思いますが一つお力を貸していただきたい思います。どうぞよろしゅうたのんます。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1024
int main()
{
rightsidehfunction();
leftsidehfunction();
}
/* 左辺の値をとって.hファイルに書き込む関数 */
int leftsidehfunction()
{
FILE *ft;
FILE *fh;
char buf[MAX];
char *cPid[MAX]; // 採取したPID
char *cWorkRegiAdd; // 採取文字列作業域アドレス
char *cStoRegiAdd; // 文字列格納域アドレス
int n = 0;
int str = 0;
int k;
char *p;
ft = fopen("test.txt","r");
fh = fopen("test.h","a+");
if (fh == NULL || ft == NULL) {
printf("ファイルを開けません。\n");
return 1;
}
/* ファイルを1行ずつ読み込む処理 */
while (fgets(buf, sizeof buf, ft) != NULL){
cWorkRegiAdd = strtok(buf, "=");
for(k = 0;k < n;k++){
if(*cPid[k] != *cWorkRegiAdd)continue;
if(strcmp(cPid[k],cWorkRegiAdd) == 0)break;
}
if(k < n) continue;
cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1);
strcpy(cStoRegiAdd,cWorkRegiAdd);
cPid[n] = cStoRegiAdd;
fprintf(fh, "#define %s 0\n", cStoRegiAdd);
n++;
}
fclose(fh);
fclose(ft);
return 0;
}
/* 右辺の値をとって.hファイルに書き込む関数 */
int rightsidehfunction()
{
FILE *ft; // 入力ファイルポインタ
FILE *fh; // 出力ファイルポインタ
int c; //読み込み文字
char buf[MAX]; //バッファ領域
char buf1[MAX];
char cPid[MAX]; // 採取したPID
char *cWorkRegiAdd; // 採取文字列作業域アドレス
char *cStoRegiAdd; // 文字列格納域アドレス
char *cRegiTab[MAX]; // 文字列登録表
int iflag = 0; // 0/1; 右/左のクオート
int ichs = 0; // chrの文字数
int istr = 0; // strの文字数
int k; // ntrの探索index
int iOid; //OID
char *p;
ft = fopen("test.txt", "r");
fh = fopen("test.h", "w");
if (fh == NULL || ft == NULL) {
printf("ファイルを開けません。\n");
return 1;
}
//ファイルを1文字ずつ読み込む
while ((c = fgetc(ft)) != EOF) {
switch (c) {
case '"':
iflag = 1 - iflag;
/*右のクオート*/
if (iflag == 0) {
cPid[ichs] = '\0';
cWorkRegiAdd = cPid;
for(k = 0;k < istr;k++){
if(*cRegiTab[k] != *cWorkRegiAdd) continue;
if(strcmp(cRegiTab[k],cWorkRegiAdd) == 0) break;
}
if(k == istr){
cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1);
strcpy(cStoRegiAdd,cWorkRegiAdd);
cRegiTab[ist[/url] = cStoRegiAdd;
istr++;
fprintf(fh, "#define %s 0\n", cStoRegiAdd);
}
ichs = 0;
}
break;
case '\n':
if (iflag == 1) {
cPid[ichs] = '\0';
iflag = 0;
}
ichs = 0;
break;
default:
if (iflag == 1) {
cPid[ichs] = c;
if (ichs < MAX - 1) {
ichs++;
}
}
break;
}
}
/* ファイルの最後が改行じゃなかった場合 */
if (ichs>0) {
cPid[ichs]='\0';
}
fclose(ft);
fclose(fh);
return 0;
}