関数化
#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は数学という
ような値が返ってくるようにしたいです。
お礼
御教示ありがとうございました。 C++のコンパイラーのoperator関数の解釈の仕方にも関係しているのですね。 通常のC/C++で使われているキャストの使い方と違っていたので違和感がありました。 上記説明で納得できました。