2

私はCode::Blocksを使用しており、IDEを介してコマンドライン拡張機能を設定しました。NULLまた、適切な引数を使用して実行可能ファイルを開きましたが、非オンfopen()リターンを取得できません。ファイル名をハードコーディングしようとしましたが、成功しませんでした。プラットフォームはWindowsXPSP3です。

1つ目は失敗したもので、ハードコーディングしたときにダブルバックラッシュを使用しました。また、最初のプロセスを開いてプロセスを開始することができなかったため、2番目が機能するかどうかもわかりませんでした。

明らかに、テキストファイルを実行可能ファイルと同じディレクトリに置き、実行可能ファイルを何度も再構築しましたが、それでも機能しません。

編集:私はperror( "fopen");を追加しました。if(finput == NULL)ブロックの行。これが出力です。

http://prntscr.com/h71pa

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

#define first_part_url "[url=http://magiccards.info/query?q="
#define second_part_url "&v=card&s=cname]"
#define end_bracket "[/url]\n"
#define output_file_prefix "output_"

char* get_card(FILE* finput);

int main(int n, char* arguments[])
{
FILE* finput;
FILE* foutput;
short int counter;
char* output_filename;
char* finalstring;


for(counter=1; counter<n; counter++)
{
    finput=fopen(arguments[counter], "r");

    if (finput==NULL)
    {
        printf("Unable to open ");
        puts(arguments[counter]);
                    perror("fopen");
        break;
    }

    strcpy(output_filename, output_file_prefix);
    strcat(output_filename, arguments[counter]);

    if((foutput=fopen(output_filename, "w"))==NULL)
    {
        printf("There was an error while trying to open ");
        puts(arguments[counter]);
        printf(" .\n");
        break;
    }

    while(!feof(finput))
    {
    finalstring=get_card(finput);
    fputs(finalstring, foutput);
    while(((fgetc(finput))!='\n')||feof(finput));
    }

    printf("Autocarding ");
    puts(arguments[counter]);
    printf(" was a success.\n");
    fclose(foutput);
}

if(finput!=NULL)
{
fclose(finput);
free(finalstring);
}
return 0;
}

char* get_card(FILE* finput)
{
char* currentcard;
char* finalstring;

currentcard=(char*)malloc(sizeof(char)*150);
fgets(currentcard, 150, finput);

/* Allocates the exact amount of space needed for the final string*/
finalstring=(char*)malloc(sizeof(char)*(strlen(first_part_url)+strlen(second_part_url)+strlen(end_bracket)+strlen(currentcard)));

/* Get all the final forum link together*/
strcat(finalstring, first_part_url);
strcat(finalstring, currentcard);
strcat(finalstring, second_part_url);
strcat(finalstring, end_bracket);

free(currentcard);

return finalstring;
}
4

3 に答える 3

2

「そのようなファイルまたはディレクトリはありません」というエラーは、開こうとしているファイル名が存在しないことを示しています。

この場合、プログラムの現在の作業ディレクトリが実行可能ファイルを含むディレクトリと同じではないことが原因である可能性があります。

于 2012-10-11T01:22:32.057 に答える
0

これ

finput=fopen(arguments[counter], "r");

正しいファイル名を指定しない場合にのみ失敗します(たとえば、名前に非ASCII文字が含まれている場合、または名前に正しいパスが含まれていないfopen()場合、ファイル名にパスが指定されていない場合は現在のディレクトリでファイルを開きます)。

これ

output_filename=(char*)malloc(sizeof(arguments[counter]));

arguments[counter]はポインタでありsizeof()、ポインタのはと同じではないため、名前に十分なスペースが割り当てられていない可能性がありますstrlen(that_same_pointer) + 1

これ

output_filename=output_file_prefix;

output_filename他の場所を指すようにポインタを再割り当てしているため、割り当てられたばかりのメモリが失われますoutput_file_prefix"output_")。

上記の後この

strcat(output_filename, arguments[counter]);

文字列リテラル()を上書きしようとするため、プログラムがクラッシュする可能性があります"output_"。これにより、C標準に従って未定義の動作が発生します。

連結する文字列に十分な累積スペースを割り当てる必要があり、割り当てられたスペースにそれらを連結する必要があります。

さらにトラブルを回避するために、別の問題があります。

finput=fopen(arguments[counter], "r");
...
while(!feof(finput))

feof()ファイルから少なくとも1回読み取った後にのみ機能します。これは何度も尋ねられ、答えられました。

于 2012-10-11T01:13:46.973 に答える
0

変更してみてください

for(counter=1; counter<n; ++n)
{

for(counter=1; counter<n; ++counter)

コードは無限にループしているように見えるため、引数配列内の可能な要素を使い果たし、NULLポインターが返されます。

于 2012-10-11T01:17:47.157 に答える