関数化
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
void swap(char p[], char q[]);
char *get(char *str, char buf[], int line, int field);
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;
int line2 = 0;
if((fp=fopen("test3.csv","r"))==NULL){
printf("ファイルが開けません");
}
while(fgets(buf, 1000, fp) != NULL){
line2++;
}
fclose(fp);
printf("%d\n", line2);
if((fp=fopen("test3.csv","r"))==NULL){
printf("ファイルが開けません");
}
data = (my *)malloc(sizeof(my) * line2);
while(fgets(buf,1000,fp) != NULL){
str = buf;
while(*str != '\0'){
bufG = get(str, buf, line, field);
switch(field){
case 0:
data[line].number = atoi(bufG);
break;
case 1:
data[line].class_type = (char *)malloc(strlen(bufG) +1);
strcpy(data[line].class_type, bufG);
break;
case 2:
data[line].name = (char *)malloc(strlen(bufG) + 1);
strcpy(data[line].name, bufG);
break;
case 3:
data[line].subject =(char *)malloc(strlen(bufG) + 1);
strcpy(data[line].subject, bufG);
break;
}
str++;
field++;
}
line++;
field = 0;
}
fclose(fp);
for(int m = 1; 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);
}
return 0;
}
char *get(char *str, char buf[], int line, int field)
{
char bufG[1111];
int i;
for(i = 0; *str != ',' && *str != '\0' ; i++){
if(*str == '\n'){
bufG[i] = '\0';
}
else{
bufG[i] = *str;
}
str++;
}
bufG[i] = '\0';
return bufG;
}
前回の質問
http://okwave.jp/qa5094929.html
で提示していただいたサンプルの関数化をはかりましたが
うまくいきません。これを実行すると1しか表示されません。
原因はおそらくポインタだと思いますがどうすればいいのか
わかりません。教えて下さい。bufを引数にする意味ないのでは
という意見は今の所はとりあえずなしで
fieldの値によってbufGが色々とってくる。
例えば1,A,山田,数学の場合
field = 0のときbufGは1
filed=1のときbufGはA
field=2のときbufGは山田
filed=3のときbufGは数学という
ような値が返ってくるようにしたいです。
お礼
誤ってメモ帳の試行錯誤している最中のソースをそのままペーストしてしまいました・・・。 ただ、ご回答のようにbufが毎回上書きされてしまうので全く意味をなさないですね。