こんにちは。
C言語で現在ある入力ファイルを読み込んで計算し、
ファイルを出力するというプログラムを作成中なのですが、
ファイルを読み込む場合に、
改行までの値を一文字ずつ読み込むという作業をさせたいと思っています。
データは、
abc
defgh
ijk
.....
といった感じで入力されており、
while((c = fgetc(fp)) != '\n'){
fscanf(fp, "%c", &q[i]);
}
と書いたのですが、セグメント例外が出て強制終了してしまいます。
初歩的なことで申し訳ないのですが、教えていただきたいと思います。よろしくおねがいします。
No.5ベストアンサー
- 回答日時:
(1)fgetc() の時点でもう既に1文字データを読んでいるので、
fscanf() で'再度取得'することはできません。
q[i] には c の値をそのまま代入してください。
(2)i はインクリメントしなくてよいのでしょうか?
(3)行の終端 '\n' を検出して while を抜けた後、
printf 文などでそのまま表示させていませんか?
文字列 q[] の終端にヌル文字を入れる必要があります。
(q[]が予めゼロクリアされているのなら入れる必要はありません)
(4)それと、feof() でファイル終端をチェックしながらやった方がいいです。
オーバーフローを起こさない為に q[] には大きめの配列を確保してください。
char q[1024];
int i = 0, c;
while( !feof( fp ) )
{
if( ( c = fgetc( fp ) ) == '\n' )
break;
q[i++] = c;
}
q[i++] = '0';
みたいな感じ。
この回答への補足
データの書き方が悪かったのですが、
実際のデータ自体は、いろいろな種類があって、
pqrs
01
p qs q
q r qr
r s p
s 0 p
p
qs
のようになっています。
一行の空行ごとにデータの種類が違うので、それによって読み込み方や、メモリを変えなければならないのです。(最後まで同じやり方でデータを読み込むのではなく、途中から途中まで。)なので、eof()の判定を使えないのではないかと
思います。
また、メモリ自体も動的に確保しなければならないので、もうちょっと変えなければなりませんよね。
やってみます。
No.4
- 回答日時:
長さが全くわからないバッファの場合は、malloc で多めに確保するのが普通ですが、reallco() で際割り当てすることも出来ます。
#include <stdlib.h>
char *a = 0;
int sizeNow = 0;
if (sizeNow が小さすぎる)
{
sizeNow += 10; // など、siezeNow を更新
realloc(a, sizeNow);
}
こんな感じで、再割り当てが出来ます。
malloc, callocについては知っていましたが、reallocというものがあることは知りませんでした。
うまく使えたら良いなと思います。
No.3
- 回答日時:
こんにちは。
ファイルから1文字ずつ読み込むとい事ですが、書かれたプログラムでは、1つ飛ばしに読んでしまします。
セグメント例外といううことですが、fscanfの読み込み使われている配列変数qにアクセスするためのインデックス番号、iがqの容量を超えてしまったか、iが不定のために起こっていると思われます。
以下にサンプルを示します。サンプル中のLENは環境に合わせて変更してください。
#define LEN 80
char q[LEN+1];
i=0;
while((c = fgetc(fp)) != '\n')
q[i++] = c;
if(i == LEN ) break;
}
q[i] = NULL;
この回答への補足
No.1の方の補足にも書いたのですが、メモリは動的に取らなければならないので、LENを使って値を決め打ちすることはできないのです。
mallocやcallocで確保する方法をやってみたのですが、それも失敗してしまったので・・・。
もう少しトライしてみます。
No.1
- 回答日時:
他の方が詳細なソースを示してくれるとおもいますので基本的なところだけ。
。fgetcで1文字読みしたときにファイルポインタは次の文字に進んでいるので、fscanfではその次の文字を読み込んでしまいます。
つまりfgetcで1文字、fscanfでもう1文字の2文字読んでいることになるため、q[]で用意したバッファサイズを超えてしまっているのではないでしょうか。
この回答への補足
早速のご回答ありがとうございます。
どうやらそのようです。
動的に領域を確保せよとのことだったので、始めに個数を数えてからq[n]のnの部分に数字を入れることは可能なのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
つい集めてしまうものはなんですか?
人間誰もは1つ「やたらこればかり集めてしまう」というものがあるもの。 あなたにとって、つい集めてしまうものはなんですか?
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
ファイルから読み込んだデータを構造体に格納できますか?
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
改行を読み飛ばす
C言語・C++・C#
-
-
4
C言語 配列の長さの上限
C言語・C++・C#
-
5
getcの改行判定
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
fopen(書き込みモード)でファイ...
-
巨大なテキストファイル(可変...
-
複数テキストファイルを読み込...
-
C言語でCSVファイルのオープ...
-
ファイルへの書き込み
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
FTPでputすると空ファイルが出...
-
フルパスから最後のディレクト...
-
バッファとは何ですか
-
ファイル名の先頭にアンダース...
-
VB.NETで他のプロジェクトで作...
-
VBAで他のプログラムが起動して...
-
OLE又はDDEを使うVISUAL BESIC...
-
ハッシュの計算時間について
-
VBからhtaファイルを開くには?
-
テキストファイルの最終行を削...
-
コンパイル ./aと./a.out の違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
テキストファイルの行数を取得...
-
バイナリファイルをテキストフ...
-
c言語 2つのファイルを行ご...
-
fgetsで2行目から文字化け
-
改行までの一文字ずつのファイ...
-
VBSで指定行に挿入
-
winsock recvでの文字化け
-
【VB.Net】バイト型配列に読み...
-
巨大なテキストファイル(可変...
-
C言語での改行コードの扱いにつ...
-
EOF判定されない
-
【C言語】テキスト読み込みの行...
-
続・EOF判定されない
-
freadでファイルを読み込んだ際...
-
fopenで開いたファイルのサイズ...
-
C言語 バイナリファイルの読み...
-
0x00をファイル出力
-
0バイトファイルの作成
-
ファイル読み込みについて
おすすめ情報