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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

1313閲覧

C++テキストファイルの読み取り方

Waruzo

総合スコア5

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2022/08/14 15:46

前提

Visual Stadio2022、C++を使用。
当方かなり初心者です。学校の授業で軽く触った程度です。大目に見てください。日常的にプログラムを使用する機会がなく困っています。
(例)
_________________________________
*・ コ 
$!   ゙  "1ワ  $・ ・  <  "W   "G.
 !ス "  %Uヲ   #Kク    1ナ    Pス  マ ・ 6_  n・GNRMC,061014.00,A,3428.9691674,N,13649.5338632,E,0.027,,200622,,,A,V1B
$GNVTG,,T,,M,0.027,N,0.051,K,A
3C
$GNGGA,056814.00,5628.9691674,N,16749.5338632,E,5,45,0.81,81.018,M,23.971,M,,7A
$GNGSA,A,4,21,15,09,02,04,10,11,06,,,,,1.58,0.71,1.40,1
0B
_________________________________
↑上のようなテキストファイルから必要な情報を書き出したいです。$○○○○以降の文字はそれぞれ先頭の文字ごとに決まった順番になっています。

実現したいこと

・テキストファイルから$以降のアルファベットを判別したい。$GNVTG,$GNGSAなどを判別

・判別した文字以降の文字をprintfでそれぞれ表示したい。
5,3,21→年齢5歳、生まれ3月、日付21日

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

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 警告 C6387 'fp' は '0' である可能性があります。 Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 30 警告 C6387 'fp' は '0' である可能性があります。 Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 35 警告 C4477 'fscanf' : 書式文字列 '%f' には、型 'float *' の引数が必要ですが、可変個引数 15 は型 'double' です Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 30 警告 C4474 'fscanf': 書式文字列に渡された引数の数が多すぎます Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 30 警告 C6270 'printf' への float 引数がありません: 変換指定子 '19' に対応する float 引数を追加してください。 Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 32 警告 C6270 'printf' への float 引数がありません: 変換指定子 '20' に対応する float 引数を追加してください。 Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 32 警告 C4473 'printf': 書式文字列として渡された引数が不足しています Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 32 警告 C6066 ポインターでない値が _Param_(17) として渡されました。'fscanf' への呼び出しにはポインターが必要です。実際の型: 'float' Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 30 警告 C6271 余分な引数が 'fscanf' に渡されました。 Satellite reading program C:\Users\81909\source\repos\Satellite reading program\Satellite reading program\Satellite reading program.cpp 30

該当のソースコード

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
FILE* fp = NULL3
char name[32] = { 0 }; // $GPGSV
float b = 0; // ビュー内の総衛星数
float c = 0; //衛星番号
float d = 0; //衛星仰角。00~90度
float e = 0; //衛星方位角。000~359度
float f = 0; //C/No(キャリア/ノイズ比)。00~99dB
float g = 0; //衛星番号
float h = 0; //衛星仰角。00~90度
float i = 0; //衛星方位角。000~359度
float j = 0; //C/No(キャリア/ノイズ比)。00~99dB
float k = 0; //衛星番号
float l = 0; //衛星仰角。00~90度
float m = 0; //衛星方位角。000~359度
float n = 0; //C/No(キャリア/ノイズ比)。00~99dB
float o = 0; //衛星番号
float p = 0; //衛星仰角。00~90度
float q = 0; //衛星方位角。000~359度
float r = 0; //C/No(キャリア/ノイズ比)。00~99dB

fopen_s(&fp, "GNSS.txt", "r"); while (fscanf(fp, "%s,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", name, &b,&c,&d,&e,&f,&g,&h,&i,&j,&k,&l,&m,&n,o,&p,&q,&r) != EOF) { printf("衛星名:%s,総GSVセンテンス数:%f,このセンテンスの番号%f,ビュー内の総衛星数%f,衛星番号%f,衛星仰角:%f 衛星方位角%f,C/No %f,衛星番号 %f,衛星仰角 %f,衛星方位角 %f,C/No %f,衛星番号 %f,衛星仰角%f,衛星方位角 %f,C/No %f,衛星番号 %f,衛星仰角 %f,衛星方位角 %f,C/No %f\n", name, b, c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r); } fclose(fp); return 0;

}

C++言語

試したこと

何を試すべきかわからない。サンプルコードを参考に書いたものです。

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

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

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

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

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

guest

回答2

0

  • fopen_s() の戻り値をチェックして、エラーならプログラムを終了するようにしましょう
  • fscanf()double の値を受け取るには、書式文字列には %lf を入れます。%f ではありません。
  • あとは、書式文字列と引数の数の不一致などです。

投稿2022/08/14 22:16

int32_t

総合スコア20832

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

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

Waruzo

2022/08/15 02:17

回答ありがとうございます。別の方法を模索してみます。
int32_t

2022/08/15 02:22

たとえば fgets() + sscanf() に直しても現在のコンパイルエラーの問題は避けられませんから、なんにせよエラーは直しておくことをおすすめします。
Waruzo

2022/08/15 02:29

了解です。参考にします。
guest

0

ベストアンサー

提示されてる文字化けしているような不定のデータのファイルを扱う場合は、scanf系の関数を使うのは筋が悪いです。
やるなら、データを1行ぶんづつ読み出して、改めてその内容を解析し、想定するフォーマットでなければ読み捨て、変換するという手法を取る必要があります

投稿2022/08/15 01:04

y_waiwai

総合スコア87747

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

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

Waruzo

2022/08/15 02:17

回答ありがとうございます。承知しました。この方法では厳しいようですね。別の方法で試します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問