こんにちは。
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsで2行目から文字化け
-
ファイル内のデータを1行削除...
-
C言語での採番について
-
改行までの一文字ずつのファイ...
-
EOF判定されない
-
【VB.Net】バイト型配列に読み...
-
winsock recvでの文字化け
-
fprintfで出力するファイルのパ...
-
fopen(書き込みモード)でファイ...
-
ファイルサイズ指定し、ファイ...
-
テキストファイルの行数を取得...
-
VBSで指定行に挿入
-
C言語初心者の質問失礼します。
-
バッファとは何ですか
-
どんなプログラムを書いても指...
-
OLE又はDDEを使うVISUAL BESIC...
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
マイクラでPythonのプログラミ...
-
FTPでputすると空ファイルが出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
テキストファイルの行数を取得...
-
c言語 2つのファイルを行ご...
-
C言語での改行コードの扱いにつ...
-
VBSで指定行に挿入
-
改行までの一文字ずつのファイ...
-
【VB.Net】バイト型配列に読み...
-
freadとfwrite
-
巨大なテキストファイル(可変...
-
0バイトファイルの作成
-
fopenで開いたファイルのサイズ...
-
fopen(書き込みモード)でファイ...
-
winsock recvでの文字化け
-
ファイルサイズ指定し、ファイ...
-
fortranで文字列を読み込む際の...
-
【C言語】テキスト読み込みの行...
-
C言語での採番について
-
VS2010 MFC CStdioFileについて
おすすめ情報