質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

654閲覧

C言語ファイル読み込みがうまくいかない

marchan

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/12/08 16:41

編集2021/12/08 17:31

前提・実現したいこと

ファイルが何行でできているか、fscanfを使って調べたい。

発生している問題・エラーメッセージ

プログラムが止まらない

該当のソースコード

C

1#include <stdio.h> 2int main(){ 3 int abs1=-999; 4 FILE * fp = NULL; 5 fopen_s(&fp, "kekka3.txt", "r"); 6 // ファイル終端まで1行ずつ変数へ読み込む 7 int j=0; 8 while (fscanf(fp, "%d", &abs1) != EOF) 9 { 10 if(j%100<10){ 11 printf("okasi"); 12 } 13 j++; 14 } 15 fclose(fp); 16 return 0; 17}

kekka3.txt

13 6 -56 39 21

試したこと

イメージとしてはabs1に13,6-56,...と次々値が代入されていくはずが、デバッグした限りではabs1の値が全く変わらない。

補足情報(FW/ツールのバージョンなど)

Hexdump for vscodeでkekka3.txtを開いたもの

Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000: FF FE 31 00 33 00 0D 00 0A 00 36 00 0D 00 0A 00 .~1.3.....6..... 00000010: 2D 00 35 00 36 00 0D 00 0A 00 33 00 39 00 0D 00 -.5.6.....3.9... 00000020: 0A 00 32 00 31 00 0D 00 0A 00 ..2.1.....

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/12/08 16:59

試してみましたが、問題なさそうでした。(abs1 と j を printf で出力するようにしてみました。) C:\home\edu\teratail\questions\372931>hello abs1 = [13] abs1 = [6] abs1 = [-56] abs1 = [39] abs1 = [21] j = [5]
cx20

2021/12/08 22:56

あぁ、ファイルが BOM 付きだったようですね。腑に落ちました。
guest

回答1

0

ベストアンサー

kekka3.txt の先頭に変な(空白文字以外で見えないような)文字が入っていないか、ファイルダンプ等で確認してください。
fscanf(fp, "%d", &abs1) は数字以外に会うと読み取らずに 0 を返しますので、無限ループすることになります。

投稿2021/12/08 17:12

編集2021/12/08 17:56
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marchan

2021/12/08 17:23

すみません。ファイルダンプのやり方を教えてください。VScodeでできますか?
jimbe

2021/12/08 17:25

VScode を使っていませんので分かりません。ごめんなさい。 「ファイルダンプ ツール」等でお探しになって見てください。
jimbe

2021/12/08 17:32

原因はともかく読みたいということであれば、 fscanf("%d",&abs1); が 0 を返したら fscanf("%*c"); で 1 文字読み飛ばしてまた fscanf("%d",&abs1); を行う…という風にループさせてしまうのも手かと思います。
marchan

2021/12/08 17:33

それっぽいのがあったのでやってみましたが見方がわからないのでよくわかりませんでした
jimbe

2021/12/08 17:50 編集

> 00000000: FF FE 31 31 が "1" です。 その前に FF FE というのが入っていますね。 これは [BOM](https://e-words.jp/w/BOM.html ) でしょう。 このファイルは UTF16 という文字コードのファイルとなっていますので、通常の C 言語では扱い難いものとなってしまっています。 お使いのエディタが UTF8 もしくは ANSI, Shift JIS や Windows-31J 等で保存できるものであれば、それらで保存してからプログラムを実行してみてください。
marchan

2021/12/08 17:48

ありがとうございます。 メモ帳で書いたところ文字コードが想定と違うものになっていたようです。 すべて解決しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問