
こんにちは。
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も見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイナリファイルをテキストフ...
-
巨大なテキストファイル(可変...
-
ファイル内のデータを1行削除...
-
C言語 バイナリファイルの読み...
-
ファイル読み込みについて
-
0x00をファイル出力
-
【VB.Net】バイト型配列に読み...
-
fprintfで出力するファイルのパ...
-
fgetsで2行目から文字化け
-
テキストファイルから読み込ま...
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
Access クエリ実行が急に非常に...
-
バッファとは何ですか
-
FTPでputすると空ファイルが出...
-
LSI C-86 v3.30c 試食版について
-
VB6で、非表示モジュール(?)の...
-
コマンド(例えばls)の出力結果...
-
VB.NETで他のプロジェクトで作...
-
csvファイルを開かずに文字を検...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルの行数を取得...
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
c言語 2つのファイルを行ご...
-
ファイル読み込みについて
-
巨大なテキストファイル(可変...
-
改行までの一文字ずつのファイ...
-
0x00をファイル出力
-
複数テキストファイルを読み込...
-
EOF判定されない
-
【VB.Net】バイト型配列に読み...
-
変数内の文字列を空にできない
-
[動的配列]C言語の勉強で簡単な...
-
続・EOF判定されない
-
0バイトファイルの作成
-
ファイルサイズ指定し、ファイ...
-
winsock recvでの文字化け
-
int型の値をファイルに保存
-
UNIXシェルプログラム等からバ...
おすすめ情報