这是我正在编写的程序的基本代码,用于练习使用C语言中的文件。我试图检测输出文件是否已经存在,如果它确实存在,我想询问用户是否要覆盖它或不。这就是我首先使用fopen(outfilename,“r”)打开outfilename文件的原因;而不是fopen(outfilename,“w”);。
它检测文件不存在的情况,但是,如果它确实存在则执行printf(“输出文件已存在,覆盖(y / n):”);声明但完全忽略了scanf(“%c”,& yn);声明!
如果文件不存在,程序末尾的printf读取“yn = 0”,如果存在,则读取“yn =”。有人能帮助我吗?
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <string.h>
int main(void) {
FILE *inf;
FILE *outf;
char filename[21],outfilename[21];
char yn='0';
printf("Please enter an input filename: ");
scanf("%s",&filename);
printf("Please enter an output filename: ");
scanf("%s",&outfilename);
/* Open file for reading */
inf=fopen (filename,"r");
outf=fopen(outfilename,"r");
/*check that input file exists*/
if (inf!=NULL) {
/*check that the output file doesn't already exist*/
if (outf==NULL){
fclose(outf);
/*if it doesn't already exist create file by opening in "write" mode*/
outf=fopen(outfilename,"w");
} else {
/*If the file does exist, give the option to overwrite or not*/
printf("Output file already exists, overwrite (y/n):");
scanf("%c",&yn);
}
}
printf("\n yn=%c \n",yn);
return 0;
}
答案 0 :(得分:23)
printf("Please enter an output filename: ");
scanf("%s",&outfilename);
当你输入第二个字符串并点击ENTER键时,字符串和一个字符放在输入缓冲区中,它们是:输入的字符串和换行符。字符串被scanf
消耗但换行符仍在输入缓冲区中。
此外,
scanf("%c",&yn);
您的下一个scanf
用于阅读该字符只是读取/使用换行符,因此永远不会等待用户输入。
解决方案是使用以下内容消耗额外的换行符:
scanf(" %c", &yn);
^^^ <------------Note the space
或使用getchar()
您可能需要查看我的答案 here ,详细解释问题。
答案 1 :(得分:1)
答案 2 :(得分:0)
scanf("%s", ...)
使\ n终止输入中的行。它不会导致下一个问题,因为scanf(“%s”,...)通过跳过白色开始。 scanf("%c", ...)
没有,因此您阅读了\n
。
BTW您可能遇到其他问题是您在文件名中放置空格(%s
不读取它们)以及输入的名称太长(%s没有输入长度限制)。
您抱怨的问题(但不是另一个问题)的一个解决方案是使用scanf(" %c", ...)
(请参阅%c
之前的空格?scanf
使用起来很棘手)从跳过开始白色空间。
答案 3 :(得分:0)
scanf("%s",&filename);
同时删除&amp;
scanf.c:13:警告:格式'%s'需要输入'char ',但参数2的类型为'char()[20u]'
答案 4 :(得分:0)
我发现处理此问题的更好方法是explained here。
它建议使用另一种处理输入的方式,并且有很好的解释。
我总是使用此功能来获取用户输入。
char * read_line (char * buf, size_t length) {
/**** Copyright de home.datacomm.ch/t_wolf/tw/c/getting_input.html#skip
Read at most 'length'-1 characters from the file 'f' into
'buf' and zero-terminate this character sequence. If the
line contains more characters, discard the rest.
*/
char *p;
if ((p = fgets (buf, length, stdin))) {
size_t last = strlen (buf) - 1;
if (buf[last] == '\n') {
/**** Discard the trailing newline */
buf[last] = '\0';
} else {
/**** There's no newline in the buffer, therefore there must be
more characters on that line: discard them!
*/
fscanf (stdin, "%*[^\n]");
/**** And also discard the newline... */
(void) fgetc (stdin);
} /* end if */
} /* end if */
return p;
} /* end read_line */
我用这条规则解决了这类问题:
// first I get what I want.
c = getchar();
// but after any user input I clear the input buffer
// until the \n character:
while (getchar() != '\n');
// this also discard any extra (unexpected) character.
如果您在任何输入后进行此操作,则应该没有问题。