gpt4 book ai didi

C - 如何提示用户输入文件名

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:40 25 4
gpt4 key购买 nike

C 编程的新手。我正在编写一个程序,我想提示用户输入要打开以供阅读的文件的名称。在下面显示的代码中,如果它没有打开或文件不存在,我想抛出一个错误,但是当我运行它时,我的代码崩溃了,我必须关闭程序 (DOS)

/*ask user for the name of the file*/
printf("enter file name: ");
gets(fname);


//Opens the file from where the text will be read.
fp=fopen(fname, "r");

//Checks if the file us unable to be opened, then it shows the error message
if (fp == NULL)
{
printf("\nError, Unable to open the file for reading\n");
}

//你可以通过创建一个 name.txt 文件来测试它。如果您需要更多信息,请告诉我。

最佳答案

那么,你应该确保 fname 中有足够的空间来存储你的文件名,否则你几乎肯定会导致损坏和“爆炸”:-)

例如,下面的片段:

char fname[10];
gets (fname);

如果您输入的信息多于 fname 可以容纳的信息,将会出现问题。那时,您进入了未定义的行为领域,任何事情都可能发生。

但是,因为 gets 没有提供限制用户输入内容的方法,您永远不应该使用它!

可以在 this answer 中找到一种正确的、 protected 用户输入方法。 .

它使用 fgets 因为它可以限制用户输入的内容。它还允许提示,在出现问题时提供错误指示,正确处理文件结尾,并删除任何过大行的剩余部分,以免影响下一个输入操作。

事实上,我将把它复制到这里以使这个答案独立:

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

#define OK 0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
int ch, extra;

// Get line with buffer overrun protection.
if (prmpt != NULL) {
printf ("%s", prmpt);
fflush (stdout);
}
if (fgets (buff, sz, stdin) == NULL)
return NO_INPUT;

// If it was too long, there'll be no newline. In that case, we flush
// to end of line so that excess doesn't affect the next call.
if (buff[strlen(buff)-1] != '\n') {
extra = 0;
while (((ch = getchar()) != '\n') && (ch != EOF))
extra = 1;
return (extra == 1) ? TOO_LONG : OK;
}

// Otherwise remove newline and give string back to caller.
buff[strlen(buff)-1] = '\0';
return OK;
}

您可以按如下方式调用它,指定缓冲区和大小,并在返回时收到错误指示:

// Test program for getLine().

int main (void) {
int rc;
char buff[10];

rc = getLine ("Enter string> ", buff, sizeof(buff));
if (rc == NO_INPUT) {
// Extra NL since my system doesn't output that on EOF.
printf ("\nNo input\n");
return 1;
}

if (rc == TOO_LONG) {
printf ("Input too long [%s]\n", buff);
return 1;
}

printf ("OK [%s]\n", buff);

return 0;
}

关于C - 如何提示用户输入文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10099581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com