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

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

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

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

Q&A

4回答

8345閲覧

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

smithat2

総合スコア8

C

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

0グッド

0クリップ

投稿2016/07/26 07:53

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;
}

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

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

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

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

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

guest

回答4

0

こんにちは。

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

投稿2016/07/26 07:59

Chironian

総合スコア23272

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

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

smithat2

2016/07/26 08: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 このようなエラーメッセージが出てしまいました。
smithat2

2016/07/26 08: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 このようなエラーメッセージが出てしまいました。
smithat2

2016/07/26 08: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 このようなエラーメッセージが出てしまいました。
Chironian

2016/07/26 08:12

wavHeaderWrite()関数は外部ライブラリで定義されているものでしょうか? もし、そうであればそのライブラリをリンクして下さい。 他の.cファイルにて定義されているようでしたら、その.cファイルも一緒にコンパイル/リンクして下さい。
guest

0

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

投稿2016/07/26 07:59

maisumakun

総合スコア145121

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

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

smithat2

2016/07/26 08: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 このようなエラーメッセージが出てしまいました。
guest

0

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

c

1#include <stdio.h> 2#include <stdlib.h> 3

投稿2016/07/26 07:59

ttyp03

総合スコア16996

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

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

smithat2

2016/07/26 08: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 このようなエラーメッセージが出てしまいました。
ttyp03

2016/07/26 08:12

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

0

#include <stdio.h>

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

投稿2016/07/26 07:57

yuba

総合スコア5568

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

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

smithat2

2016/07/26 08: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 このようなエラーメッセージが出てしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問