![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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"
"あ","い","う","え"
"か","き","く","け"
"さ","し","す","せ"
"た","ち","つ","て"
とし、真ん中のq,r,s,t以降の内容を表示させたく、下のようなプログラムを作成しました
しかし、コンパイル後実行しようとするとエラーになってしまいます。どう直したらよいか教えて頂けますでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME "test.csv"
#define SIZE 32
struct tb{
char a[SIZE];
char b[SIZE];
char c[SIZE];
char d[SIZE];
};
int main(void)
{
struct tb test;
FILE *fp;
char buff[SIZE];
long pos;
pos=ftell(fp);
fseek(fp,pos,SEEK_SET);
while(fgets(buff,SIZE,fp) != NULL){
//各項目の設定
strcpy(test.a,strtok(buff,",\""));
strcpy(test.b,strtok(NULL,",\""));
strcpy(test.c,strtok(NULL,",\""));
strcpy(test.d,strtok(NULL,",\""));
printf("%s %s %s %s \n",test.a,test.b,test.c,test.d);
}
}
No.6ベストアンサー
- 回答日時:
#5です。
質問を良く読んでいませんでした(申し訳ない)。>真ん中のq,r,s,t以降の内容を表示させたく、・・・
とのことですので、whileは省略してはならず。質問のプログラムを用いることになります。失礼しました。
せっかくですので、やっていることの説明を付けておきます。
/* これは回答プログラムです */
#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; //file position
};
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");
//data table からオフセット値を得る
for(i = 0; i < ALL; i++)
//もし、data table の検索文字(word)があれば脱
if(strstr(search, table[i].word) != NULL) break;
//ただし、該当文字がなければエラー
if(i >= ALL){
fclose(fp);
return -1;
}
//file position は data table 番号i にある offset値をセット
pos = table[i].offset;
//ヘッドを指定 file position まで移動する
fseek(fp,pos,SEEK_SET);
while(fgets(buff,SIZE,fp) != NULL){
//各項目の設定
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);
}
fclose(fp);
return 0;
}
/* これは上とは違う別物の参考プログラムです */
#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];
//現在の file position をセット
seek_point = ftell(fp);
//file を1行読み込む
while(fgets(buff,SIZE,fp) != NULL) {
//検索文字があれば
if(strstr(buff, key) != NULL) {
//検索文字とfile posiion を出力する
printf("%s %d\n", pref[i], seek_point);
//ただし、次の file position が eof で有るならば loop 脱
if(++i >= ALL) break;
//次の検索文字をセット
key = pref[i];
}
//現在の file position をセット
seek_point = ftell(fp);
// while() の先頭へ
}
fclose(fp);
return 0;
}
No.5
- 回答日時:
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;
}
No.4
- 回答日時:
> pos=ftell(fp);
> fseek(fp,pos,SEEK_SET);
この行、意味無いように思えるんですが。
それから、 fopenを付け加えるのは、この ps=ftell(fp); の前である必要がありますが、それは大丈夫ですか?
「whileの前」が直前の意味だったら、 ftellが不正なfpに対して実行されるので誤動作する可能性が高いですが。
No.2
- 回答日時:
>Segmentation faultでてしまいました。
「Segmentation fault」はメモリアクセスに問題がある場合に発生する。
ここで問題が出る可能性があるのは、バッファ操作を行うstrcpy()とstrtok()。
その部分を重点的に見直すこと。
No.1
- 回答日時:
ファイルをオープンしている処理と、ファイルをクローズしている処理が見当たりませんよ。
この回答への補足
初歩的でしたね。しかし、
while文の後に
if((fp=fopen(NAME,"r"))==NULL){
printf("ファイル%sが開けません\n",NAME);
return -1;
}
と
whileを抜けた後にfcloseして、コンパイル・実行しましたが、Segmentation faultでてしまいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C言語】ファイルを読み込んで...
-
C言語でセグメンテーションエ...
-
複数ファイルの同時読み込みの...
-
fopenでファイル名に、変数を使...
-
エラーがわかりません、、
-
C言語でファイルの内容を strto...
-
テキストファイル内に対して, ...
-
ファイル読み込み EOF 判定
-
隣接行列を読み込んで有向グラ...
-
ファイルが読み込めない・・・
-
c言語でデータの指定列の度数分...
-
作成したプログラムファイルの...
-
csvfファイルの1行目と3行目を...
-
日本語ファイル名のFTPについて
-
C言語について
-
01番の二次元配列でこの実行結...
-
write関数でファイルディスクリ...
-
行列のファイル入力の仕方
-
バイナリファイルの読み込み(C...
-
c言語 ファイルから数字を読み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ガンマ変換 C言語でプログラ...
-
c言語でのfscanfについて
-
なぜCSQとCIP形式ではコ...
-
複数ファイルの同時読み込みの...
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
ファイルへの書込み処理が異常...
-
【C言語】ファイルを読み込んで...
-
エラーがわかりません、、
-
C言語でセグメンテーションエ...
-
C言語でファイル読み書きを早く...
-
テキストファイル内に対して, ...
-
fgets( ) の返り値は何?
-
ファイルに行番号を追加
-
OpenGLによる描画内容をBMP出力
-
fscanfでループしてしまう。
-
c言語 ファイルから数字を読み...
-
ファイルが読み込めない・・・
-
CRC32の計算方法
-
CSVファイルの内容を構造体に格...
おすすめ情報