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

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

ただいまの
回答率

90.61%

  • C++

    3349questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 419

hiro12358

score 2

前提・実現したいこと

waveファイルを読み込み、その後ある処理をする。

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

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

該当のソースコード

main.cpp

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

#include "stdafx.h"
#include "string.h"
#include "stdlib.h"

#include "spWav.h"

int soukan(FILE *fpIn1, FILE *fpIn2, long posOfData, long sizeOfData)
{


    fseek(fpIn1, posOfData, SEEK_SET);

    fseek(fpIn2, posOfData, SEEK_SET);

    //long sz1, sz2;
    //sz1 = ftell(fpIn1);
    //sz2 = ftell(fpIn2);

    //printf("各位置表示子は%s、%s。",sz1,sz2 );


    short *InS1;
    InS1 = (short*)malloc(sizeof(sizeOfData));

    if (fread(InS1, sizeOfData, 1, fpIn1) != 1)
        return -1;

    short *InS2;
    InS2 = (short*)malloc(sizeof(sizeOfData));

    if (fread(InS2, sizeOfData, 1, fpIn2) != 1)
        return -1;

    int i, k;

    short *soukan;
    soukan = (short*)malloc(sizeof(sizeOfData));

    for (k = 0; k < 16000; k++)//sizeOfData - i
    {
        for (i = 0; i < 16000; i++)
        {
            soukan[k] = soukan[k] + InS1[i] * InS2[i + k];

        }

    }

    //相関関数soukan[k]の最大値を探す。

    int j;
    short soukanMax;
    soukanMax = 0;

    for (j = 0; j < 16000; j++) 
    {
        if (soukanMax < soukan[j])
            soukanMax = soukan[j];
    }


    printf("相関関数の値は %d 。\n", soukanMax);

    return 0;

    free(InS1);
    free(InS2);

}



int main()
{
    SpParam sp;
    WrSWaveFileHeader wHdr;
    long totalLength;

    unsigned long sampRate;
    unsigned short sampBits;
    long posOfData, sizeOfData;

    FILE *fpS1,*fpS2;

    char filename1[200], filename2[200];


    printf("比較するwavの名前を入れてください。\n");
    scanf_s("%s", filename1,200);


    /*err = fopen_s(&fpS1, filename1, "r");
    if (err != 0)
    {
        fprintf(stderr, "%s をオープンできません.\n", filename1);
        getchar();
        exit(EXIT_FAILURE);
    }*/



    if ((fpS1 = fopen("nani.wav", "rb")) == NULL)
    {
        fprintf(stderr, " WAVをオープンできません。\n" );
        getchar();
        return -1;  //error
    }

        // エラー確認兼ねるインプットしたWAVファイルのヘッダーの読み込み
        if (wavHdrRead(&*fpS1, &sampRate, &sampBits, &posOfData, &sizeOfData) != 0) 
            return -1;


        printf("比較元のwavの名前を入れてください。\n");
        scanf_s("%s", filename2, 200);




        if ((fpS2 = fopen("soukanyou2.wav", "rb")) == NULL)
        {
            fprintf(stderr, " WAVをオープンできません。\n" );
            return -1;  //error
        }

        //エラー確認兼ねるインプットしたWAVファイルのヘッダーの読み込み
        if (wavHdrRead(&*fpS2, &sampRate, &sampBits, &posOfData, &sizeOfData) != 0) //FILE型の中身はunsigned char。
            return -1;


        soukan(fpS1, fpS2, posOfData, sizeOfData);

        fclose(fpS1);
        fclose(fpS2);

        getchar();

    return 0;
}


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が見つかりません」なども発生した。

ビルドは通っています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/09/30 17:56

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

    キャンセル

  • hiro12358

    2017/09/30 18:14

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

    キャンセル

  • hiro12358

    2017/09/30 18:15

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/01 11:43

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3349questions

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