0

下面是问题的主要描述,它发生在哪里。但简单地说,我无法弄清楚为什么在询问后会收到错误消息

if (outf!=NULL){
    printf("Output file already exists, overwrite (y/n):");
    scanf("%c",yn);
}

其中 outf 是指向现有文件的文件指针。请在代码中途阅读描述。

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

int main() {

/* Declare file pointer */
    FILE *inf;
    FILE *outf;

    int linenumber,linecounter=0,linepresent;
    char filename[21];
    char detail[21];
    char linedetail[21];
    char outfilename[21];
    char letter,yn='y';
    int position;

/*INPUT DETAILS Ask user for file name and line number*/

    printf("Please enter an input filename and a linenumber: ");
//scan filename to char string and line number to int variable
    scanf("%s %i",&filename,&linenumber);

/*OUTPUT DETAILS Ask user for file name, letter & position, etc*/
    printf("Please enter an output filename, a letter and a position:");    
    scanf("%s %c %i",&outfilename,&letter,&position);

/* Open file for reading */
    inf=fopen (filename,"r");
    outf=fopen(outfilename,"r");
/*check that file exists*/
    if (inf!=NULL) {

直到这里一切正常!然后我尝试找出outf文件是否已经存在。如果 outf 指向现有文件,它会打印“输出文件已存在,覆盖(y/n):”

但是,一旦打印出来,我就会打开错误窗口!这可能是一个非常菜鸟的错误——我还在学习 C。如果没有这样的文件,程序会正常完成并绕过 if 语句。

        if (outf!=NULL){
            printf("Output file already exists, overwrite (y/n):");
            scanf("%c",yn);
        }
        if (yn=='y'){
    /*keep reading to end of file*/
            while (feof(inf)==0) {
                linecounter++;
    /*read each line and store the line number in detail[WORDS GO HERE]*/
                fscanf (inf,"%s", &detail);
    /*If we reach the line selected by the user*/
                if (linecounter==linenumber){
                    strcpy(linedetail,detail);
                    linepresent=1;
                }
            }
            if (linepresent==0) {
                printf("File only contains %i lines",linecounter);
            }
        } else {
            exit(1);
        }
    } else {
        printf("Input file not found");
    }

printf("%s",linedetail);

/* close the file */

    fclose(inf);
    fclose(outf);

    return (0);

}
4

3 回答 3

3

首先,已经提到的问题:您正在以阅读模式打开输出文件。要打开它进行写作:

outf=fopen(outfilename,"w");  /* Note the "w". */

此外, scanf() 接受指向变量的指针,而不是它们的值,所以如果你写scanf("%c", yn);,你会将 scanf 字符y作为指针,这是胡说八道。你需要这样做:scanf("%c", &yn);.

但是,即使您修复了这些问题,您的程序也不会按照您的预期进行。如果您尝试打开写入的文件不存在,fopen()则不会返回 NULL,它将创建一个新文件。如果存在,您的代码将始终覆盖输出文件。NULL 仅在fopen无法打开/创建文件时返回(例如,您没有执行此操作的权限),您应该像这样处理它:

outf=fopen(outfilename, "w");
if(outf == NULL) {
    perror("Failed to open output file: ");
    fclose(inf);  /* Don't leave files opened. It's bad form. */
    exit(1);
}
/* Open succeeded, do your stuff here. */

请注意,在 ,else之后不需要任何块if,因为exit()会立即结束程序。

此外,没有“指向文件的指针”之类的东西。FILE 只是一个表示打开文件的结构。

于 2011-12-10T18:24:54.100 回答
0

http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

您正在使用读取标志打开输出文件。尝试将其更改为“w”。

outf=fopen(outfilename,"w");

虽然值得注意的是,写入用“w”打开的文件会破坏旧文件。使用“a”附加到文件。

于 2011-12-10T18:02:19.020 回答
0

您应该将地址传递ynscanf函数。

scanf("%c", &yn);

于 2011-12-10T18:03:08.070 回答