ポインタ
#include "stdafx.h"
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char number[6];
char class_type[20];
char name[8];
char subject[5];
} my;
my data[100];
int main(int argc, char* argv[])
{
FILE *fp;
int field = 0, line = 0;
char buf[1000], *str;
char bufG[1111];
int i;
if((fp=fopen("test.txt","r"))==NULL){
printf("ファイルが開けません");
}
while(fgets(buf,1000,fp) !=NULL){
str=buf;
while(*str != '\0'){
if(*str != ','){
for(i = 0; *str != ',' && *str != '\0' ; i++){
if(*str == '\n'){
}
else{
bufG[i] = *str;
}
str++;
}
bufG[i] = '\0';
// printf("%s", bufG);
switch(field){
case 0:
strcpy(data[line].number, 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;
}
field++;
}
else{
str++;
}
}
line++;
field = 0;
}
printf("%s", data[2].subject);
fclose(fp);
return 0;
}
このプログラムをベースにしてメモリの無駄を省けるような
プログラムに修正したいのですが、
ポインタほんとできなくて困ってます。
教えていただいてメモリを取る位置とかは大体わかりました。
まず構造体のメモリをとります。しかしこのままでは固定長になってるので
構造体を少しいじくりますよね。
構造体の中身なのですが
typedef struct{
int number;
char *class_type;
char *name;
char *subject;
} my;
my *data;
にして
data = malloc(100);
このような形でとります。
文字列の型ですがchar *class_typeのようにポインタで宣言しないと
bufGを代入して値を入れるときに型が合いませんので
配列にしないのであればポインタ型宣言でいいと思います。
しかしポインタで宣言してstrcpy(・・)の所を
data[line].class_type = bufG
にするとエラーはでませんが*strの値が変わる度に
data[line].class_typeの値が変動するのでdata[line].class_typeが
国語 とかになったりします。
なんかもうさっぱりわからないんですが
どうすればいいのでしょうか?
変換したソースがほしいです。
お礼
ありがとうございます。大変よく分かりました。