2

我正在使用 Code::Blocks 并通过 IDE 设置了命令行参数。NULL我还使用正确的参数打开了可执行文件,但我无法获得非fopen()返回值。我试过硬编码文件名也没有成功。该平台是Windows XP SP3。

第一个是失败的,当我对其进行硬编码时,我使用了双反冲。我也不知道第二个是否有效,因为我从未设法通过打开第一个来启动该过程。

显然我将文本文件放在可执行文件的同一目录中并多次重建可执行文件,但它仍然不起作用。

编辑:我添加了 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()仅在从文件中读取至少一次后才有效。这已被多次询问和回答

于 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 回答