dポイントプレゼントキャンペーン実施中!

こんにちは!!
ご質問させてください。
右辺値のダブルクオートくくりの
文字列をテキストから読み込みファイルに書き込む処理ですが.....
うまく取れません。下記にソースコードを提示しましたので
一読の上アドバイスいただけたらと思います。
テキストファイルのないようは
k="seikyo"-"himawari"
k="north"+"seikyo"
これを読み込んだ場合.tファイルに書き込む内容は
seikyo
himawari
north
seikyo
ですが重複した場合は書き込まないようにプログラムしたつもりです。
seikyo
himawari
north
としたいと思っています。
希望通りの形にならないので皆様どうか
お力をお貸しください。よろしくお願いします。







#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<syslog.h>
#define MAX_REC_A 256
#define MAXFIELD 128
#define BUFFLEN 256
#define MAX 10000
#define MBF 1024

int makemoutputhrightside();

int
main(int argc ,char **argv)
{
makemoutputhrightside(argv[1]);

}

/* 右辺の値をとって.tファイルに書き込む関数 */
int
makemoutputhrightside(char sum[BUFFLEN])
{

FILE *ft;
FILE *fh;
int c;
char cPid[BUFFLEN];
char *p;
char *q;
char *str[BUFFLEN];
int flag = 0;
int i = 0;
int n = 0;
int k;
char filename[64];
char cdmy[MAX];
strcpy(filename,sum);
strcat(filename,".txt");

ft = fopen(filename, "r");
fh = fopen("moutput.t", "a");

if (ft == NULL || fh == NULL) {
syslog(LOG_ERR,"開けないファイルがあります。\n");
return 1;
}
//ファイルを1文字ずつ読み込む
while ((c = fgetc(ft)) != EOF) {
switch (c) {
case '"':
flag = 1 - flag;
/*右のクオート*/
if (flag == 0) {
cPid[i] = '\0';
p = strcpy(cdmy,cPid);

for(k = 0;k < n;k++){
if(*str[k] != *p)
continue;
if(strcmp(str[k],p) == 0)
break;
}
if(k < n)
continue;
q = malloc(strlen(p) + 1);
strcpy(q,p);
str[n] = q;
fprintf(fh, "%s ",q);
i = 0;
}
n++;
break;
case '\n':
if (flag == 1) {
cPid[i] = '\0';
fprintf(fh, "%s \n", cPid);
}
flag = 0;
}
i = 0;
break;
default:
if (flag == 1) {
cPid[i] = c;
if (i < BUFFLEN - 1) {
i++;
}
}
break;
}

}
/* ファイルの最後が改行じゃなかった場合 */
if (i>0) {
cPid[i]='\0';
fprintf(fh,"%s\n",cPid);
}

fclose(ft);
fclose(fh);

return 0;

}

A 回答 (1件)

ぱっと見た感じ, n をインクリメントするタイミングが間違ってるような気がする.


あと, 「ファイルの最後が開業じゃなかった場合」も微妙におかしい.
それにしても, 「意味のわかる変数を使おう」という気にはならないものなんだろうか....

この回答への補足

ご返信ありがとうございます。
具体的にどうしたらいいでしょうか??
詳しく教えていただけないでしょうか??
かなり困っていまして(・ ・")。。。。。
どうぞよろしくお願いします。

補足日時:2008/11/19 15:43
    • good
    • 0

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