みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CArray

#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE -1
char* get(char **p_str);
char *get_line(char buf[]);
int comp_rtn(const void *p1, const void *p2);

typedef struct {
int number;
char class_type[10];
char name[15];
char subject[10];
int ten;

} my;
my *data;
void myswap(my *p, my *q);
int main(int argc, char* argv[])
{
FILE *fp;
int field = 0, line = 0;
char buf[1000], *str;
char *bufFormat;
char *bufG;


int line2 = 0;

if((fp=fopen("jjj.txt","r"))==NULL){
printf("ファイルが開けません");
}

while(fgets(buf, 1000, fp) != NULL){
line2++;
}
fclose(fp);

if((fp=fopen("jjj.txt","r"))==NULL){
  printf("ファイルが開けません");
}

data = (my *)malloc(sizeof(my) * line2);

while(fgets(buf,1000,fp) != NULL){
bufFormat = get_line(buf);
str = bufFormat;
while(*str != '\0'){
bufG = get(&str);
switch(field){
     case 0:
data[line].number = atoi(bufG); break
case 1:
strcpy(data[line].class_type, bufG);
break;
case 2:
strcpy(data[line].name, bufG);
break;
case 3:
strcpy(data[line].subject, bufG);
break;
case 4:
data[line].ten = atoi(bufG);
break;
}
str++;
field++;
}
line++;
field = 0;
}

fclose(fp);
qsort(data,line,sizeof(my),comp_rtn);

for(int m = 0; m < line; m++){
printf("%d\n", data[m].number);
printf("%s\n", data[m].class_type);
printf("%s\n", data[m].name);
printf("%s\n", data[m].subject);
printf("%d\n", data[m].ten);
printf("\n");
}
free(data);


return 0;

}


void myswap(my *p, my *q)
{
my temp;
temp = *p;
*p = *q;
*q = temp;
}
char *get(char **p_str)
{
int i;
char *str;
str = *p_str;

static char bufG[1000];
for(i = 0; *str != ',' && *str != '\0' ; i++){
if(*str == '\n'){
bufG[i] = '\0';
}
else if(*str == '\\'){
str++;
if(*str == 'c'){
bufG[i] = ',';
}
else if(*str == '"'){
bufG[i] = '"';
}
}
else{
bufG[i] = *str;
}

str++;
}

bufG[i] = '\0';
*p_str = str;
return bufG;
}

char *get_line(char buf[])
{
int in_quotation = FALSE, i = 0;
char* str = buf;

static char bufG[1000];
while(*str != '\0'){
if(*str=='"'){
if(in_quotation == TRUE){
str++;
if(*str == '"'){
bufG[i] = '\\';
i++;
bufG[i] = '"';
i++;
}
else{
in_quotation = FALSE;
bufG[i] = *str;
i++;
}
}
else{
in_quotation = TRUE;
}
}
else{
switch(*str){
case '\n':
if(in_quotation == TRUE){
bufG[i] = '\\';
i++;
bufG[i] = 'n';
i++;
}
else{
bufG[i] = *str;
i++;
}
break;
case ',':
if(in_quotation == TRUE){
bufG[i] = '\\';
i++;
bufG[i] = 'c';
i++;
}
else{
bufG[i] = *str;
i++;
}
break;
default:
bufG[i] = *str;
i++;
}
}
str++;
}
bufG[i] = '\0';
return bufG;
}


以前上記のソースになるプログラムの質問をいくつかしました。
これはCで組んでますがC++で組みなおすに当たり
今mallocを使っていますがCArrayを使用するように薦められました
どういう感じになるのかさっぱりわかりません。

投稿日時 - 2009-08-11 15:39:01

QNo.5199125

すぐに回答ほしいです

質問者が選んだベストアンサー

おっと, コンストラクタで大きさを設定できないのか.
構造体を CArray に突っ込めばいいです. 「現状からなるべくいじらない」方針で行くなら
・my *data; を CArray<my> data; にする
・data = malloc(...); の代わりに data.SetSize(line2);
・qsort(data,line,sizeof(my),comp_rtn); を qsort(data.GetData(),line,sizeof(my),comp_rtn); にする
の 3か所をいじればいいんじゃないかな. まあ, 「CArray を使う意味」はほとんどありませんが.
本格的に CArray を使うのであれば
・最初の「行数を数える」ところをすべて削る
・必要に応じて data.Add
がさらに追加されます.
でも, #1 でも書いたけど std::vector が使えるようになるとよりよいと思う.

投稿日時 - 2009-08-11 17:36:05

お礼

できました。ありがとうございました

投稿日時 - 2009-08-12 13:33:10

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

CArray についてどのくらい調べたのでしょうか? 基本的には malloc でメモリを確保する代わりに CArray のコンストラクタで確保するだけだと思うんだけど....
もっとも, 個人的には CArray よりも std::vector の方が安心できるような気がする. ついでに char の配列もやめて std::string を使うとより安心.

投稿日時 - 2009-08-11 16:17:42

補足

うーん C言語の配列に似てるけど配列の縮小や拡張ができる
といった利点ぐらいでしょうか。後メンバ関数でどんなことができる
とかですね。要はCArrayの使い方がわからないんですよね。
ヘルプはあんまり初心者向きにはなってないですから。
例えばCArray<CString, CString> test; として
test.Add(/*追加したい内容*/)とかそういった超基本的な使い方は
わかるんですけど、構造体をCArrayで格納すればいいのか、
色んなころがごちゃごちゃになって思考がおいつかない状態です。

投稿日時 - 2009-08-11 16:30:14