2

これは私のコードです。この形式で 10 個のファイルを作成する必要があります。

0.txt
1.txt
...

しかし、私はそれを行うことはできません、結果は異なります。誰でも助けることができますか?

#include <stdlib.h>
#include <string.h>


char* direccion(char *dirD,int number){
    char buffer[100];
    char *n;
    char *q;
    char* formato=".txt";

    sprintf(buffer, "%i", number);
    n= strcat(dirD,buffer);
    q= strcat(n,formato);

    return q;

}
int main(){
    int u;
    int number= 0;
    int t= 0;
    char* q = "e:/c9/";
    for(t=0; t< 10 ; t++){

        char* dir = direccion(q,number);

            if(fopen(dir,"w")){
                fopen(dir,"w");
                u=1;
            }
            else{
                u=0;
                printf("Error\n");
            }
        number++;

    }
    return 0;
}

ありがとう !

4

3 に答える 3

3

問題 1 は次のとおりです。

char *q = "e:/c9/";
for(t = 0; t < 10; t++)
{
    char *dir = direccion(q, number);
}

変数 q は文字列リテラルです。ただし、関数direccion()では、それを最初の引数として に渡しますstrcat()。これは、それを変更しようとします — BOOM、セグメンテーション違反。解決:

char buf[1000];
strcpy(buf, "e:/c9/");
char *dir = direccion(buf, number);

問題#2は、@Charlie Martinが指摘したように、静的にdireccion()自動的に割り当てられたローカル文字列を返すことです。これは、関数が戻った後は無効です。多分

return strdup(buffer);

この場合; 使用後は忘れずに解放してください。

編集:これについても尋ねないようです。open()システムコール (関数)を使用してファイルを作成できます。

#include <fcntl.h>
#include <stdio.h>

int fd = open("file.txt", O_RDWR | O_CREAT, 0644);
close(fd);

もちろん、必要な実際のファイル モードを 0644 に置き換えます (ただし、実行するプログラムが含まれていない限り、ファイルを実行可能にしないでください)。

編集 2: 私もこれをキャッチしませんでした...したがって、for ループでは、ベース ファイル名を何度もリセットする必要があります。

for (yadda yadda)
{
    strcpy(buf, "e:/c9/");
    char *dir = direccion(buf, i);
}

于 2012-07-27T21:24:17.177 に答える
2

関数内でバッファを自動で割り当てています。つまり、スタックに割り当てられています。あなたが戻ったとき、その記憶はもはや有効ではありません。呼び出し元でバッファーを割り当ててポインターを渡すか、静的として割り当てます。

于 2012-07-27T21:21:23.093 に答える
0

Windows には、パスに拡張子を追加するなどの操作に使用できる一連のパス処理関数があります。例えば:

PathAddExtension(buffer,".txt");

詳細については、 http://msdn.microsoft.com/en-us/library/windows/desktop/bb773559( v=vs.85 ).aspx を参照してください。

また、パスを処理するときは、_MAX_PATH サイズのバッファーを使用することをお勧めします。

于 2012-07-27T21:59:38.390 に答える