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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2871閲覧

ソースファイルがないというエラーで困っています。

hiro12358

総合スコア6

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/09/30 08:47

###前提・実現したいこと
waveファイルを読み込み、その後ある処理をする。

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

fread.cppが見つかりません。

###該当のソースコード
main.cpp

C++

1 2// Soukan.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 3// 4 5#include "stdafx.h" 6#include "string.h" 7#include "stdlib.h" 8 9#include "spWav.h" 10 11int soukan(FILE *fpIn1, FILE *fpIn2, long posOfData, long sizeOfData) 12{ 13 14 15 fseek(fpIn1, posOfData, SEEK_SET); 16 17 fseek(fpIn2, posOfData, SEEK_SET); 18 19 //long sz1, sz2; 20 //sz1 = ftell(fpIn1); 21 //sz2 = ftell(fpIn2); 22 23 //printf("各位置表示子は%s、%s。",sz1,sz2 ); 24 25 26 short *InS1; 27 InS1 = (short*)malloc(sizeof(sizeOfData)); 28 29 if (fread(InS1, sizeOfData, 1, fpIn1) != 1) 30 return -1; 31 32 short *InS2; 33 InS2 = (short*)malloc(sizeof(sizeOfData)); 34 35 if (fread(InS2, sizeOfData, 1, fpIn2) != 1) 36 return -1; 37 38 int i, k; 39 40 short *soukan; 41 soukan = (short*)malloc(sizeof(sizeOfData)); 42 43 for (k = 0; k < 16000; k++)//sizeOfData - i 44 { 45 for (i = 0; i < 16000; i++) 46 { 47 soukan[k] = soukan[k] + InS1[i] * InS2[i + k]; 48 49 } 50 51 } 52 53 //相関関数soukan[k]の最大値を探す。 54 55 int j; 56 short soukanMax; 57 soukanMax = 0; 58 59 for (j = 0; j < 16000; j++) 60 { 61 if (soukanMax < soukan[j]) 62 soukanMax = soukan[j]; 63 } 64 65 66 printf("相関関数の値は %d 。\n", soukanMax); 67 68 return 0; 69 70 free(InS1); 71 free(InS2); 72 73} 74 75 76 77int main() 78{ 79 SpParam sp; 80 WrSWaveFileHeader wHdr; 81 long totalLength; 82 83 unsigned long sampRate; 84 unsigned short sampBits; 85 long posOfData, sizeOfData; 86 87 FILE *fpS1,*fpS2; 88 89 char filename1[200], filename2[200]; 90 91 92 printf("比較するwavの名前を入れてください。\n"); 93 scanf_s("%s", filename1,200); 94 95 96 /*err = fopen_s(&fpS1, filename1, "r"); 97 if (err != 0) 98 { 99 fprintf(stderr, "%s をオープンできません.\n", filename1); 100 getchar(); 101 exit(EXIT_FAILURE); 102 }*/ 103 104 105 106 if ((fpS1 = fopen("nani.wav", "rb")) == NULL) 107 { 108 fprintf(stderr, " WAVをオープンできません。\n" ); 109 getchar(); 110 return -1; //error 111 } 112 113 // エラー確認兼ねるインプットしたWAVファイルのヘッダーの読み込み 114 if (wavHdrRead(&*fpS1, &sampRate, &sampBits, &posOfData, &sizeOfData) != 0) 115 return -1; 116 117 118 printf("比較元のwavの名前を入れてください。\n"); 119 scanf_s("%s", filename2, 200); 120 121 122 123 124 if ((fpS2 = fopen("soukanyou2.wav", "rb")) == NULL) 125 { 126 fprintf(stderr, " WAVをオープンできません。\n" ); 127 return -1; //error 128 } 129 130 //エラー確認兼ねるインプットしたWAVファイルのヘッダーの読み込み 131 if (wavHdrRead(&*fpS2, &sampRate, &sampBits, &posOfData, &sizeOfData) != 0) //FILE型の中身はunsigned char。 132 return -1; 133 134 135 soukan(fpS1, fpS2, posOfData, sizeOfData); 136 137 fclose(fpS1); 138 fclose(fpS2); 139 140 getchar(); 141 142 return 0; 143} 144 145 146

readHeader.cpp

#include "stdafx.h" #include "stdio.h" #include "string.h" #include "spWav.h" /*チャンク情報読み込み*/ static int readfmtChank(FILE *fp, tWaveFormatPcm* waveFmtPcm) { if (fread(waveFmtPcm, sizeof(tWaveFormatPcm), 1, fp) != 1) return -1; printf(" データ形式:%u (1 = PCM)\n", waveFmtPcm->formatTag); printf(" チャンネル数:%u\n", waveFmtPcm->channels); printf(" サンプリング周波数:%lu [Hz]\n", waveFmtPcm->samplesPerSec); printf(" バイト数/秒:%lu [bytes/sec]\n", waveFmtPcm->bytesPerSec); printf(" バイト数×チャンネル数:%u [bytes]\n", waveFmtPcm->blockAlign); printf(" ビット数/サンプル:%u [bits/samples]\n", waveFmtPcm->bitsPerSample); /*if (waveFmtPcm->channels != 2) { printf("\nこのプログラムはステレオをファイルを対象としています。\n"); printf("このwavファイルのチャンネル数は%dです。\n", waveFmtPcm->formatTag); return -1; } if (waveFmtPcm->formatTag != 1) { printf("\nこのプログラムは無圧縮PCMのみを対象とします。\n"); printf("このWAVファイルの形式は %04x です。 \n", waveFmtPcm->formatTag); return -1; } if (waveFmtPcm->bitsPerSample != 8 && waveFmtPcm->bitsPerSample != 16) { printf(" \nこのプログラムは8/16ビットサンプリングされたものを対象とします\n"); printf("このWAVファイルの bits/secは %d です。 \n", waveFmtPcm->bitsPerSample); return -1; }*/ return 0; } /*ファイル内読み出し*/ int wavHdrRead(FILE *fp, unsigned long *sampRate, unsigned short *sampBits, long *posOfData, long *sizeOfData) { SWaveFileHeader waveFileHeader; tWaveFormatPcm waveFmtPcm; tChank chank; long fPos, len; //FILE *fp; //if ((fp = fopen(wavefile, "rb")) == NULL) //{ // fprintf(stderr, " &sをオープンできません。\n", wavefile); // return -1; //error //} //fprintf(stdout, "\n%s :\n", wavefile); //ヘッダ情報 if (fread(&waveFileHeader, sizeof waveFileHeader, 1, fp) != 1) { fprintf(stderr, " %ld で読み込み失敗。\n", ftell(fp)); fclose(fp); return -1; //error } if (memcmp(&waveFileHeader.hdrRiff, STR_RIFF, 4) != 0) { fprintf(stderr, "'RIFF'フォーマットではない。\n"); fclose(fp); return -1; //error } //WAVEヘッダ情報 if (memcmp(waveFileHeader.hdrWave, STR_WAVE, 4) != 0) { fprintf(stderr, "'WAVE'がない。\n"); fclose(fp); return -1; //error } //4byteこれ以降のバイト数=(ファイル数-8)(byte) len = waveFileHeader.sizeOfFile; //チャンク情報 while (fread(&chank, sizeof chank, 1, fp) == 1) { if (memcmp(chank.hdrFmtData, STR_fmt, sizeof chank.hdrFmtData) == 0) { len = chank.sizeOfFmtData; printf("\"fmt \"の長さ: %ld [bytes]\n\n", len); fPos = ftell(fp); if (readfmtChank(fp, &waveFmtPcm) != 0) return -1; *sampRate = waveFmtPcm.samplesPerSec; *sampBits = waveFmtPcm.bitsPerSample; fseek(fp, fPos + len, SEEK_SET); } else if (memcmp(chank.hdrFmtData, STR_data, 4) == 0) { *sizeOfData = chank.sizeOfFmtData; printf("\n\"data\" の長さ: %ld [byte]\n", *sizeOfData); *posOfData = ftell(fp); //ここで実データ部の直前の位置表示子を取得 fseek(fp, fPos + len, SEEK_SET); break; } else { len = chank.sizeOfFmtData; printf("\"%c%c%c%c\"も長さ: %ld [bytes]\n\n", chank.hdrFmtData[0], chank.hdrFmtData[1], chank.hdrFmtData[2], chank.hdrFmtData[3], len); fPos = ftell(fp); fseek(fp, fPos + len, SEEK_SET); } } fclose(fp); return 0; } ```ヘッダー spWav.h

#pragma once
// WAVE2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#ifndef SPWAV_HEADER

#define SPWAV_HEADER

#ifndef _MAX_PATH
#define _MAX_PATH (255)
#endif
/もし「マックスパス」が定義されてないときはこのifndef~endifの間の宣言は読み込まない(二重定義を避けるため?)/

#pragma pack(push,1)
/*
構造体の配置制御のための宣言らしい。
構造体内のデータが指定されたバイト単位に数に続くように?丁度のいちにくるようにすうるもの*/

/ここから構造体/
typedef struct tagSWaveFileHeader //tagSWaveFileHeaderっていう構造体を作った、というポインタを作ったとも言える
{
char hdrRiff[4]; //'Riff'は4バイト
unsigned int sizeOfFile; //ファイルサイズ―8
char hdrWave[4]; //'Wave'は4バイト
/*
charは文字一つを格納するためのデータ型
unsignedは符号ビットの負の値を無くし正の値に、実質的に二倍
*/
} SWaveFileHeader;

typedef struct tagChank //tagChankという構造体を作った
{
unsigned char hdrFmtData[4]; //'fmt 'or'Data'は4バイト
unsigned int sizeOfFmtData; //size of (PCM,WAVE,FOTMAT)orWaveサイズデータ
} tChank;

typedef struct tagWaveFormatPcm //tagWaveFormatPcmという構造体を作った
{
unsigned short formatTag; //WAVE_FORMAT_PCM
unsigned short channels; //number of rate
unsigned int samplesPerSec; //samplingrate
unsigned int bytesPerSec; //samplesPerSec channels (bitsPerSecSample/8)
unsigned short blockAlign; //block align
unsigned short bitsPerSample; //bits per sampling

/* shortは整数型の宣言で2バイト指定、intは2,unsigned intは4バイトらしい この2バイト指定重要だぞ! */

} tWaveFormatPcm;

typedef struct tagWrSWaveFileHeader
{
unsigned char hdrRiff[4]; //RIFF
unsigned int sizeOfFile; //ファイルサイズー8
unsigned char hdrWave[4]; //WAVE
unsigned char hdrFmt[4]; //fmt
unsigned int sizeOfFmt; //( PCMWAVEFORMAT )のサイズ
struct
{
unsigned short formatTag; //WAVE_FORMAT_PCM
unsigned short channels; //チャンネルナンバー
unsigned int samplesPerSec; //サンプリングレート
unsigned int bytesPerSec; //サンプリング秒(bitespersec/8)
unsigned short blockAlign; //ブロックアライン
unsigned short bitsPerSample; //サンプリングバイト
} stWaveFormat;
unsigned char hdrData[4]; //data
unsigned int sizeOfData; //waveの実データサイズ
} WrSWaveFileHeader;

//readHeader
int wavHdrRead(FILE *wavefile,
unsigned long *sampRate, unsigned short *sampBits,
long *posOfData, long *sizeOfData);
long wavHeaderWrite(FILE *fp, long sizeOfData, unsigned short ch,
unsigned long sampRate, unsigned short sampBits);

#pragma pack(pop)

//defines

#define STR_RIFF "RIFF"
#define STR_WAVE "WAVE"
#define STR_fmt "fmt "
#define STR_data "data"

#define WAV_MONAURAL 1
#define WAV_STEREO 2

//関数の引数
typedef struct tagParam
{
unsigned int sizeOfDate; //Waveデータサイズ
unsigned short channels; //チャンネル数
unsigned int samplesPerSec; //Hz
unsigned int bytesPerSec; //バイト数/秒
unsigned short bitsPerSample; //8ビット OR 16ビット
long PosOfData; //エンディアン上でWAVデータの最初の始まる位置
long cycleuSec; //間隔:maikuro
}SpParam;

//プロトタイプ
void usage(void);
int writeWaveData(FILE fpOut, SpParam sp);

#endif

###試したこと エンコード上書き保存(ユニコード形式)などをしてみた。 ###補足情報(言語/FW/ツール等のバージョンなど) 「fread.cppが見つかりません」以外にも自分で設定したブレークポイント次第では「errno.cppが見つかりません」なども発生した。 ビルドは通っています。

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

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

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

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

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

t_obara

2017/09/30 08:56

せっかくご提示されたソース全ては見きれないのですが、ビルドが通っているということは、提示されてるのは実行時のエラーですか?fread.cppはどのタイミングで出力されるのでしょうか?デバッグの際に、freadにステップインしようとした時でしょうか?
hiro12358

2017/09/30 09:14

はい、そうです。実行時のエラーです。同様に[fread.cppがありません」というメッセージも、関数soukanにあるfreadをステップインしたときに起こります。
hiro12358

2017/09/30 09:15

すみません。遅れましたが、回答ありがとうございます。
guest

回答1

0

ベストアンサー

VSで開発されていてプロジェクトの設定で C/C++ > コード生成 > ランタイムライブラリを”マルチスレッドデバッグ”にしている時、freadでブレークしてからステップインしようとするとランタイムライブラリのデバッグ情報からソースコード(fread.cpp)を探しに行こうとするためそのように表示されます。(マルチスレッドデバッグDLLなら表示されません)

特にfreadの中身を確認する必要がないのであれば、気にせずfreadから次に進むときはステップオーバーし、エラーが表示されてしまった場合はステップアウトすればいいです。

ソースコードを追いたい場合は、VSのインストーラでランタイムソースをインストールしていれば

C:\Program Files (x86)\Windows Kits\10\Source[version]\ucrt

の下にあるのでそれを指定すればいいですよ。

投稿2017/09/30 09:18

toki_td

総合スコア2850

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

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

hiro12358

2017/10/01 02:43

回答ありがとうございます。単純に.cppを参照すればよかったのですね。デバックに関しては、まだ理解が乏しいので勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問