1

私は現在、現在のビルド ディレクトリのすべての .wav ファイルを取得する必要がある cvi アプリケーションに取り組んでいます。C でこれを行うには、次の関数で Windows 組み込み関数 FindFirstFIle と FindNextFile を使用しています。

int listingWavFileNameInDirectory( char projectDirectory[MAX_PATHNAME_LEN], int numberOfWavFile, char **ListOfWavFile)
{
    WIN32_FIND_DATA searchingFile;
    HANDLE handleFind = NULL;
    char workingPath[2048];

    sprintf(workingPath, "%s\\*.wav*", projectDirectory);

    if( (handleFind = FindFirstFile(workingPath, &searchingFile)) != INVALID_HANDLE_VALUE)
    {
        ListOfWavFile[0] = searchingFile.cFileName;
        i = 1;
        while(FindNextFile(handleFind, &searchingFile)
        { 
            ListOfWavFile[i] = searchingFile.cFileName;
            i++;
        }
        if( !FindClose(handleFind))
            return GetLastError();

        return 0;
    }
    else
    {
        return GetLastError();
    }
}

この関数は、最初の wav ファイル ( ListOfWavFile[0] に正しい文字列があります) に対しては正常に機能しますが、FindNextFile を介して取得され、ListOfWavFile[i] が含まれる他のファイル名に対しては機能しません。ListOfWavFile[i] は実際には空の文字列です。理由がわかりません。これは、以前の関数への私の呼び出しです:

GetProjectDir(projectDirectory);
numberOfWavFile = countingWavFileInDirectory(projectDirectory);
listOfWavFile = malloc(numberOfWavFile * sizeof(char *));
for(int i = 0; i < numberOfWavFile; i++)
{
    listOfWavFile[i] = malloc(256 * sizeof(char));
}
listingWavFileNameInDirectory(projectDirectory, numberOfWavFile, listOfWavFile); 

私は Windows 7 64 ビットを使用しており、アプリケーションは 64 ビット アプリケーションとしてコンパイルされています。このスレッドで述べたように、Wow64DisableWow64FsRedirection を使用しようとしましたが、うまくいきません。

何か案は ?

4

2 に答える 2

1

LabWindows/CVI では、

#include <ansi_c.h>  //header collector for ansi C libraries included in CVI environment

次の提案が機能するために...

いくつかの例外を除いて 、文字列のコピーまたは連結関数を使用して値を文字列に割り当てる必要があります。

C では、初期化時以外に、=演算子を使用してchar配列 ( char *a;char a[];) に値を代入することはできません。

たとえば、次のようなものがあります。

char *a = {"this is an initialization string"};
//or
char a[] = {"this is an initialization string"};

全然大丈夫...

これはそうではありません:

char a[80] = {0}; //okay
char b[] = {"this is a string"}; //okay still

a = b;  //Not OKAY  

代わりに strcpy を使用します。

strcpy(a, b);  //the correct way

したがって、コードで次の変更を行います: (適切に初期化され、メモリが割り当てられていると 仮定
ListOfWavFilechar **

strcpy(ListOfWavFile[0], searchingFile.cFileName);//HERE
i = 1;
while(FindNextFile(handleFind, &searchingFile)) //note the addition of the last ")"
{ 
    strcpy(ListOfWavFile[i], searchingFile.cFileName);//And HERE
    i++;
}

コンパイル警告を最大まで上げます。
CVI では、次のように表示されます (または、バージョンによっては同様です)。
ここに画像の説明を入力

于 2014-10-30T18:56:27.513 に答える
0

に関する @ooga のコメントに加えてstrcpy()、この行には ) がありません

while(FindNextFile(handleFind, &searchingFile)

そして、使用していないi引数に対して範囲チェックを行う必要があります。numberOfWavFileOK、最初に .wav ファイルの数を見つけましたが、フォルダーを解析するまでにそれが変わっている可能性があります。配列の使用に関しては、何も仮定しないでください。したがって、上記の行は次のようになります

while (FindNextFile(handleFind, &searchingFile) && i < numberOfWavFile)
于 2014-10-30T18:37:24.507 に答える