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

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

ただいまの
回答率

90.35%

  • C

    4951questions

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

unknown type name ‘FILE’の解決法について

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,249

smithat2

score 6

c言語初心者ですが、本を参考にWAVファイルの速度を変えるプログラムを書きました。
しかし、何度やっても
wavspeed.c:80:28: error: unknown type name ‘FILE’
extern long wavHeaderWrite(FILE *fp, SpParam* sp);
と出てしまいます。
対処法はなにかないでしょうか。

<プログラム>

ifndef _SPWAV_HEADER_

define _SPWAV_HEADER_

ifndef _MAX_PATH

define _MAX_PATH (255)

endif

pragma pack(push,1)

typedef struct tagSWaveFileHeader
{
char         hdrRiff[4];
unsigned int sizeOfFile;
char         hdrWave[4];
} SWaveFileHeader;

typedef struct tagChank
{
unsigned char  hdrFmtData[4];
unsigned int   sizeOfFmtData;
} tChank;

typedef struct tagWaveFormatPcm
{
unsigned short  formatTag;
unsigned short  channels;
unsigned int    samplesPerSec;
unsigned int    bytesPerSec;
unsigned short  blockAlign;
unsigned short  bitsPerSample;
} tWaveFormatPcm;

typedef struct tagWrSWaveFileHeader
{
unsigned char  hdrRiff[4];
unsigned int   sizeOfFile;
unsigned char  hdrWave[4];
unsigned char  hdrFmt[4];
unsigned int   sizeOfFmt;
struct{
unsigned short  formatTag;
unsigned short  channels;
unsigned int    samplesPerSec;
unsigned int    bytesPerSec;
unsigned short  blockAlign;
unsigned short  bitsPerSamples;
} stWaveFormat;
unsigned char  hdrData[4];
unsigned int   sizeOfData;
} WrSWaveFileHeader;

pragma pack(pop)

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    samplesPerSec;
unsigned short  bitsPerSamples;
unsigned int    sizeOfData;
unsigned short  channels;
unsigned int    bytesPerSec;
long             posOfData;
int              start;
int              end;
} SpParam;

int  wavHdrRead(char *wavefile, SpParam* sp);
extern long wavHeaderWrite(FILE *fp, SpParam* sp);

endif

include <stdio.h>

include <stdlib.h>

int wavDataWrite(FILE *fpIn, FILE *fpOut, SpParam* sp)
{
int rVal=0;
void* pMem=NULL;

fseek(fpIn, sp->posOfData, SEEK_SET);

if((pMem=malloc(sp->sizeOfData))==NULL)
{
printf("メモリが確保出来ません。\n");
return -1;
}
if(fread(pMem, sp->sizeOfData, 1, fpIn) != 1)
{
printf("読み込みに失敗しました。\n");
free(pMem);
return -1;
}

if(fwrite(pMem, sp->sizeOfData, 1, fpOut) != 1)
{
printf("書き込みに失敗しました。\n");
free(pMem);
return -1;
}
free(pMem);

return rVal;
}

int wavWrite(char *inFile, char *outFile, SpParam* sp)
{
FILE *fpIn, *fpOut;

if((fpOut = fopen(outFile, "wb")) == NULL)
{
printf("%s をオープン出来ません。\n", outFile);
return -1;
}

if(wavHeaderWrite(fpOut, sp)!=44)
{
printf("ヘッダを書き込めません: %s\n", outFile);
fclose(fpOut);
return -1;
}

if((fpIn=fopen(inFile, "rb")) == NULL)
{
fprintf(stderr, "%s をオープンできません。\n", inFile);
fclose(fpOut);
return -1;
}

if(wavDataWrite(fpIn, fpOut, sp )!=0)
{
printf("wavDataWriteでエラー発生。\n");
fclose(fpIn);
fclose(fpOut);
return -1;
}
fclose(fpIn);
fclose(fpOut);
return 0;
}

void usage(void)
{
fprintf(stderr,
"サンプリング周波数を変更します(ヘッダのみ)。\n"
"引数に<入力ファイル名><出力ファイル名><速度の倍率>\n"
"を指定してください。\n\n"
"例 : pgm in.wav out.wav 1.2\n");
}

int main(int argc, char *argv[])
{
SpParam sp;
if(argc != 4)
{
usage();
return -1;
}

if( wavHdrRead(argv[1], &sp)!=0)
return -1;

sp.samplesPerSec=(int)(atof(argv[3])*sp.samplesPerSec);
printf("\n%d [Hz]へ変換しました。\n", sp.samplesPerSec);

if( wavWrite(argv[1],argv[2], &sp)!=0)
return -1;

printf("\n%s を %sへ変換しました。\n", argv[1],argv[2]);

return 0;
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+1

こんにちは。

FILEは、#include <stdio.h>の後でないと使えません。
#include <stdio.h>#include <stdlib.h>はソース・ファイルの先頭付近においた方が良いです。
また、#ifndef#endifの間には置かないように注意下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/26 17:07

    ありがとうございます。
    しかし訂正をしてコンパイルしてみたところ
    /tmp/ccZFvVah.o: 関数 `wavWrite' 内:
    wavspeed.c:(.text+0x149): `wavHeaderWrite' に対する定義されていない参照です
    /tmp/ccZFvVah.o: 関数 `main' 内:
    wavspeed.c:(.text+0x286): `wavHdrRead' に対する定義されていない参照です
    collect2: error: ld returned 1 exit status
    このようなエラーメッセージが出てしまいました。

    キャンセル

  • 2016/07/26 17:07

    ありがとうございます。
    しかし訂正をしてコンパイルしてみたところ
    /tmp/ccZFvVah.o: 関数 `wavWrite' 内:
    wavspeed.c:(.text+0x149): `wavHeaderWrite' に対する定義されていない参照です
    /tmp/ccZFvVah.o: 関数 `main' 内:
    wavspeed.c:(.text+0x286): `wavHdrRead' に対する定義されていない参照です
    collect2: error: ld returned 1 exit status
    このようなエラーメッセージが出てしまいました。

    キャンセル

  • 2016/07/26 17:11

    ありがとうございます。
    しかし訂正をしてコンパイルしてみたところ
    /tmp/ccZFvVah.o: 関数 `wavWrite' 内:
    wavspeed.c:(.text+0x149): `wavHeaderWrite' に対する定義されていない参照です
    /tmp/ccZFvVah.o: 関数 `main' 内:
    wavspeed.c:(.text+0x286): `wavHdrRead' に対する定義されていない参照です
    collect2: error: ld returned 1 exit status
    このようなエラーメッセージが出てしまいました。

    キャンセル

  • 2016/07/26 17:12

    wavHeaderWrite()関数は外部ライブラリで定義されているものでしょうか?
    もし、そうであればそのライブラリをリンクして下さい。

    他の.cファイルにて定義されているようでしたら、その.cファイルも一緒にコンパイル/リンクして下さい。

    キャンセル

0

#include <stdio.h>


を、FILE型を使うより前へ持っていけば解決しそうに見えます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/26 17:08

    ありがとうございます。
    しかし訂正をしてコンパイルしてみたところ
    /tmp/ccZFvVah.o: 関数 `wavWrite' 内:
    wavspeed.c:(.text+0x149): `wavHeaderWrite' に対する定義されていない参照です
    /tmp/ccZFvVah.o: 関数 `main' 内:
    wavspeed.c:(.text+0x286): `wavHdrRead' に対する定義されていない参照です
    collect2: error: ld returned 1 exit status
    このようなエラーメッセージが出てしまいました。

    キャンセル

0

提示のソースは、1ソースファイルということで良いでしょうか?
ひとまずこの2行を先頭に移動してみたらどうでしょうか。

#include <stdio.h>
#include <stdlib.h>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/26 17:08

    ありがとうございます。
    しかし訂正をしてコンパイルしてみたところ
    /tmp/ccZFvVah.o: 関数 `wavWrite' 内:
    wavspeed.c:(.text+0x149): `wavHeaderWrite' に対する定義されていない参照です
    /tmp/ccZFvVah.o: 関数 `main' 内:
    wavspeed.c:(.text+0x286): `wavHdrRead' に対する定義されていない参照です
    collect2: error: ld returned 1 exit status
    このようなエラーメッセージが出てしまいました。

    キャンセル

  • 2016/07/26 17:12

    wavHeaderWriteとwavHdrReadは、おそらく参考にしている本で提供しているライブラリなので、リンクする必要がありますね。
    本に使い方が書いてないでしょうか?

    キャンセル

0

extern long wavHeaderWrite(FILE *fp, SpParam* sp);の時点でFILEが何かわからなくてエラーとなっているので、この行より前に#include <stdio.h>を移す必要があります(stdio.hの中にFILEの定義があります)。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/26 17:07

    ありがとうございます。
    しかし訂正をしてコンパイルしてみたところ
    /tmp/ccZFvVah.o: 関数 `wavWrite' 内:
    wavspeed.c:(.text+0x149): `wavHeaderWrite' に対する定義されていない参照です
    /tmp/ccZFvVah.o: 関数 `main' 内:
    wavspeed.c:(.text+0x286): `wavHdrRead' に対する定義されていない参照です
    collect2: error: ld returned 1 exit status
    このようなエラーメッセージが出てしまいました。

    キャンセル

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

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

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

  • C

    4951questions

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