ポインタ(追加質問)
http://okwave.jp/qa5092628.html
の続きです。補足にいれようかとも思いましたが
以前より前の質問は占めたほうがいいと言われつづけてたので
閉めてしまいました。
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct{
int number;
char *class_type;
char *name;
char *subject;
} my;
my *data;
int main(int argc, char* argv[])
{
FILE *fp;
int field = 0, line = 0;
char buf[1000], *str;
char bufG[1111];
int i, non_value = 0;
data = malloc(sizeof(my)*100); //最大100人分とる。それを越えたケースは今は考慮しない。ここを変更
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';
switch(field){
case 0:
data[line].number=atoi(bufG); //ここを変更
break;
case 1:
data[line].class_type = malloc(strlen(bufG)+1); //これを追加
strcpy(data[line].class_type, bufG);
break;
case 2:
data[line].name = malloc(strlen(bufG)+1); //これを追加
strcpy(data[line].name, bufG);
break;
case 3:
data[line].subject = malloc(strlen(bufG)+1); //これを追加
strcpy(data[line].subject, bufG);
break;
}
field++;
}
else{
str++;
non_value++;
if(non_value == 2){
switch(field){
case 0:
data[line].number=' '; //ここを変更
break;
case 1:
data[line].class_type = malloc(3); //これを追加
strcpy(data[line].class_type, " ");
break;
case 2:
data[line].name = malloc(3); //これを追加
strcpy(data[line].name, " ");
break;
case 3:
data[line].subject = malloc(3); //これを追加
strcpy(data[line].subject, " ");
break;
}
non_value = 0;
str++;
field++;
}
}
line++;
field = 0;
}
//ここはおまけ
for (i =0; i < line;i++){
printf("%d:%s:%s:%s\n", data[i].number,data[i].class_type,data[i].name,data[i].subject);
}
fclose(fp);
return 0;
}
前回載せてもらった解答ではcsvファイルに空欄があると
値が代入されなかったのでその機能をつけました。
具体的には,が連続してあると(csvファイルに空欄がある場合1,A,,数学のように,と,の間には何もない)場合半角スペースを入れてます。
この場合例えば1,A,,数学のように名前の欄を空白にするとdata[0].name
は半角スペースが入ってますが
その次の値、すなわちdata[0].subjectの値がばぐった値になっています。
改善方法を教えて下さい。
もう1点あります。上のソースでは
data = malloc(sizeof(my)*100); //最大100人分とる。それを越えたケースは今は考慮しない。ここを変更
とありますがこれを
while(fgets(buf,1000,fp) != NULL){
str = buf;
data = malloc(sizeof(my)*100); ←このへんに
if(line > 100)){
//メモリ追加処理
}
のようにすることは可能ですか?
お礼
ありがとうございます! まさにやりたかったことです。 環境的にはC++なのですが、全体的にCで書かれている為、上記をCに置換して試してみます。 forの外で配列分確保する。。。ここに気付けませんでした。 また memo1 を開放するのではなく、p を開放する。 これは勉強になりました。