test.csvファイルは「 "" 」のダブルクォーテーションを省いた
a,b,c,d
e,f,g,h
i,j,k,l
m,n,o,p
q,r,s,t
u,v,w,x
あ,い,う,え
か,き,く,け
さ,し,す,せ
た,ち,つ,て
とするとき、コマンドラインから「 ./a.out r 」と入力することで検索できます。a.out に続く引数を b,f,j,n,r,vとそれぞれ引数を換えて実行してみてください。
/* これは回答プログラムです */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME "test.csv"
#define SIZE 32
#define ALL 6
struct tb{
char a[SIZE];
char b[SIZE];
char c[SIZE];
char d[SIZE];
};
struct set2 {
char word[4];
long offset;
};
int main(int argc, char *argv[]) {
struct tb test;
FILE *fp;
char buff[SIZE];
long pos;
int i;
char *search; //検索文字
struct set2 table[ALL]= { //abcのみで失礼
"b",0,
"f",8,
"j",16,
"n",24,
"r",32,
"v",40
};
if(argc!=2) return 1;
search=argv[1];
fp=fopen(NAME,"r");
//データ・テーブルからオフセット値を得る
for(i = 0; i < ALL; i++)
if(strstr(search, table[i].word) != NULL) break;
if(i >= ALL){
fclose(fp);
return -1;
}
pos = table[i].offset;
//ヘッドを移動する
fseek(fp,pos,SEEK_SET);
//メイン処理(文字記憶位置が指定されることから whileは不要)
fgets(buff,SIZE,fp);
//各項目の設定
strcpy(test.a,strtok(buff,",\""));
strcpy(test.b,strtok(NULL,",\""));
strcpy(test.c,strtok(NULL,",\""));
strcpy(test.d,strtok(NULL,",\""));
fclose(fp);
printf("%s %s %s %s \n",test.a,test.b,test.c,test.d);
return 0;
}
これに使われた table の offset 値は以下のプログラムから求められたものです。
/* これは参考プログラムです */
#include <stdio.h>
#include <string.h>
#define SIZE 128
#define ALL 10
int main(void) {
char buff[SIZE];
int seek_point, i = 0;
FILE *fp;
char *key, *pref[] = {"b","f","j","n","r","v","い","き","し","ち"};
fp = fopen("test.csv", "r");
key = pref[i];
seek_point = ftell(fp);
while(fgets(buff,SIZE,fp) != NULL) {
if(strstr(buff, key) != NULL) {
printf("%s %d\n", pref[i], seek_point);
if(++i >= ALL) break;
key = pref[i];
}
seek_point = ftell(fp);
}
fclose(fp);
return 0;
}
補足
ありがとうございます。参考にさせていただきました。