下面问题的主要描述,它发生的地方。但简单地说,我无法弄清楚为什么在询问后会收到错误消息
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);
}
答案 0 :(得分:3)
首先,已经提到的问题:您在阅读模式下打开输出文件。打开它写作:
outf=fopen(outfilename,"w"); /* Note the "w". */
另外,scanf()接受指向变量的指针,而不接受它们的值,所以如果你写scanf("%c", yn);
,你会给scanf字符y
作为指针,这是无意义的。你需要这样做:scanf("%c", &yn);
。
然而,即使您修复了这些问题,您的计划也无法实现您的期望。如果您尝试打开以进行写入的文件不存在,fopen()
不会返回NULL,则会创建一个新文件。您的代码将始终覆盖输出文件(如果存在)。仅当fopen
无法打开/创建文件时(例如您没有权限执行此操作),才会返回NULL,您应该像这样处理它:
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()
会立即结束该程序。
此外,没有指向文件&#34;的指针。 FILE只是一个表示打开文件的结构。
答案 1 :(得分:0)
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/
您使用read标志打开输出文件。尝试将其更改为“w”。
outf=fopen(outfilename,"w");
虽然值得注意的是写入用“w”打开的文件会破坏旧文件。使用“a”附加到文件。
答案 2 :(得分:0)
您应该将yn
的地址传递给scanf
函数。
scanf("%c", &yn);