こんにちは。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル 7 2022/11/03 19:21
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
ファイルから読み込んだデータを構造体に格納できますか?
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
改行を読み飛ばす
C言語・C++・C#
-
-
4
C言語 配列の長さの上限
C言語・C++・C#
-
5
テキストファイルから文字列を読み込んで二次元配列に格納するには
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VB.Net】バイト型配列に読み...
-
改行までの一文字ずつのファイ...
-
同じ名前のファイルを作った場...
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
Access クエリ実行が急に非常に...
-
フルパスから最後のディレクト...
-
バッファとは何ですか
-
innerHTMLで画面更新後、初期画...
-
絶対パスの絶対て英語で何でし...
-
ソースから参照しているOCXの一...
-
MySQLのrootパスワードを忘れた...
-
python matplotlibで作ったグラ...
-
vb.netでレジストリ操作
-
コマンドプロンプトで外のexeや...
-
マッチング処理
-
Excelマクロでの再読込み方法
-
ページ読み込み時に自動的にsub...
-
VB.NETで他のプロジェクトで作...
-
webアプリケーションでの画像フ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
テキストファイルの行数を取得...
-
バイナリファイルをテキストフ...
-
c言語 2つのファイルを行ご...
-
fgetsで2行目から文字化け
-
改行までの一文字ずつのファイ...
-
VBSで指定行に挿入
-
winsock recvでの文字化け
-
【VB.Net】バイト型配列に読み...
-
巨大なテキストファイル(可変...
-
C言語での改行コードの扱いにつ...
-
EOF判定されない
-
【C言語】テキスト読み込みの行...
-
続・EOF判定されない
-
freadでファイルを読み込んだ際...
-
fopenで開いたファイルのサイズ...
-
C言語 バイナリファイルの読み...
-
0x00をファイル出力
-
0バイトファイルの作成
-
ファイル読み込みについて
おすすめ情報