- ベストアンサー
ファイル操作
あるファイルから長さの違った数字や文字を読み込んで配列に格納したいのですが数字などの長さが違うとなんかおかしくなってしまいます; 例えば 1 a 1 2 a 2 3 b 3 4 b 4 などのファイルはできるのですが 0 1 2 3 a 3 4 b 4 5 c 5 の場合5つの配列に格納したいのです。1行目で1つ2行目で1つ3行目の 左、真ん中、右の数字でそれぞれ1つづつ格納したいのです。 それで自分でやったのですが typedef struct path{ int left [100]; int right[100]; char center [100]; }Path; int main(int argc,char *argv[]) { FILE *fp; Path path; int i=0; int first; int second[100]; fp = fopen(argv[1],"r"); while(fscanf(fp,"%d %c %d",&path.left[i],&path.center[i],&path.right[i])==3){ i++; } fclose(fp); このようにやると3行目からはきちんとよみこむのですが1、2行目がうまくできません@@; firstとsecondのそれぞれ1、2行目を入れたいのです。 fscanfをもう1つ増やすしてもやってみましたがうまくいきませんでした。 ちなみにfscanf関数のところをならったばかりです。 fgetcとかそのようなのを使うのでしょうか?(よくわからないですけど) よろしくお願いします。ちなみにLinuxでgcc、C言語です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じで同でしょう? #include<stdio.h> #include<stdlib.h> #include<memory.h> #include<ctype.h> typedef struct path { int left; int right; char center; }Path; Path Split(char *pinter, int checkLen); int main(int argc,char *argv[]) { FILE *fp; Path path[100]; char tempBuffer; int lengthCounter; int seekOffset; int dataSetOffset; char *pTemp; int counter; fp = fopen(argv[1], "r"); // 初期化 lengthCounter = 0; seekOffset = 0; dataSetOffset = 0; counter = 0; memset(path, 0, sizeof(path)); while((tempBuffer = (char)fgetc(fp)) != EOF) { lengthCounter++; if(tempBuffer == '\n') { // メモリ確保 pTemp = (char*)malloc(lengthCounter); if(pTemp != NULL) { fseek(fp, seekOffset, SEEK_SET); fread(pTemp, 1, lengthCounter, fp); *(pTemp + (lengthCounter-1)) = '\0'; // split path[counter++] = Split(pTemp, lengthCounter); // メモリ解放 free(pTemp); // 読込み開始位置更新 seekOffset += (lengthCounter + 1); lengthCounter = 0; } else { printf("fails in the memory securing."); break; } } } if(lengthCounter != 0) { } fclose(fp); } Path Split(char *pinter, int checkLen) { int i; int count; int numType; Path tempPath; char *pTemp; int number; memset(&tempPath, 0, sizeof(Path)); pTemp = malloc(checkLen); if(pTemp != NULL) { memset(pTemp, 0, checkLen); numType = 1; count = 0; number = 0; for(i=0; i<checkLen; i++) { if((*(pinter+i) != '\0') && (*(pinter+i) != ' ')) { *(pTemp + count) = *(pinter+i); count++; if(isdigit(*(pinter+i)) == 0) { numType = 0; } } if((*(pinter+i) == ' ') || (*(pinter+i) == '\0')) { if(numType == 1) { if(number++ == 0) tempPath.left = atoi(pTemp); else tempPath.right = atoi(pTemp); } else { tempPath.center = *pTemp; } // 再初期化 numType = 1; count = 0; memset(pTemp, 0, checkLen); } } free(pTemp); } return(tempPath); }
その他の回答 (1)
- gonbee774
- ベストアンサー率38% (198/511)
1行を文字列として読んで、 その文字列を解析する。 (何文字でこうさいされているか、2番目が数字か否か、など?) その解析結果(あるいは解析しながら)所望の変数にとり込む。 で、できそうな気がします。
お礼
回答ありがとうございます<(_ _)> あんましぱっとこないのでよく考えてみます@@;
お礼
こ、こんなに長くなるんですね@@; 一度コンパイルしてどのように動くか考えたいと思います! 回答ありがとうございます<(_ _)>