C 试图创建txt文件,但表示无法打开文件
对编程非常陌生。我试图创建一个txt文件,要求用户输入文件名,然后输入文件文本。起初,我得到了一个关于null的错误,所以我放了一个if语句,似乎代码无法打开具有该名称的文件。试图做一些研究,最后做了一些改变,但仍然导致了同样的错误C 试图创建txt文件,但表示无法打开文件,c,file,text,null,C,File,Text,Null,对编程非常陌生。我试图创建一个txt文件,要求用户输入文件名,然后输入文件文本。起初,我得到了一个关于null的错误,所以我放了一个if语句,似乎代码无法打开具有该名称的文件。试图做一些研究,最后做了一些改变,但仍然导致了同样的错误 include <stdio.h>; include <stdlib.h>; int main() { char *fileName[100]; char inputText[100]; printf("Wh
include <stdio.h>;
include <stdlib.h>;
int main()
{
char *fileName[100];
char inputText[100];
printf("What is the .txt file name? \n");
scanf_s("%123s", &fileName);
strcat(fileName, ".txt");
FILE *textFile;
textFile = fopen_s(&textFile, fileName, "w");
if (textFile != 0)
{
printf("Cannot get file");
return -1;
}
printf("What should be written in the text file? \n");
scanf_s("%123s", &inputText);
fprintf(textFile, "%s", inputText);
fclose(textFile);
return 0;
}
包括;
包括,;
int main()
{
字符*文件名[100];
字符输入文本[100];
printf(“什么是.txt文件名?\n”);
扫描文件(“%123s”和文件名);
strcat(文件名为“.txt”);
文件*textFile;
textFile=fopen_s(&textFile,文件名,“w”);
如果(文本文件!=0)
{
printf(“无法获取文件”);
返回-1;
}
printf(“文本文件中应该写入什么?\n”);
scanf_s(“%123s”、&inputText);
fprintf(文本文件,“%s”,inputText);
fclose(文本文件);
返回0;
}
根据MSDN文档,fopen_s的参数形式为FILE**而不是FILE*。它还返回错误代码,而不是文件句柄,文件句柄不是函数的返回值。因此,您在这段代码中所做的是用一些不相关的整数覆盖您的文件句柄。如果将错误代码存储在不同的变量中,则应该解决该问题
更多关于fopen的信息可以在这里找到:在学习C语言时,你能做的最重要的事情是——放慢速度。有很多东西需要学习,你必须一步一步地学习。猜测、编译、查看是否有任何变化、更改其他内容以及(重复)这些都没有用。查一查 也就是说,您感兴趣的是从
stdin
/stdout
到打开以供写入的文件的基本输入/输出。目前尚不清楚您是使用scanf\u s
操作windows,还是使用非\u s
版本,因为它们在下面是混合和匹配的。不管怎样,主要的区别在于所需的参数
在C语言中,您声明数组用于保存文件名,而inputtext用于保存100
个字符。使用字符串时,每个字符串的末尾都需要一个nul终止字符('\0'
…或仅0
,数字相同)。这意味着您最多可以在filename
或inputtext
中存储99
个字符+1
nul终止字符(旁注:C通常避免混合大小写的变量名,以支持所有小写,但这取决于您)
为了防止写入超出文件名
或输入文本
结尾的内容,您需要确保限制试图存储在其中的字符数。您可以使用格式说明符的字段宽度选项来实现这一点。e、 g
或对于windows\u s
版本:
scanf_s ("%99s", inputtext, 100u);
但是,使用%99s
格式说明符不允许输入包含空格,因为%s
格式说明符将读取到第一个空格或换行符。其次,它不会读取(或以任何方式处理)由于按[Enter]键而生成的用户输入结束时的'\n'
。如果您的下一个输入是字符输入,这将导致问题,因为scanf
将愉快地接受'\n'
作为下一个要读取的字符。现在%s
将跳过前导空格('\n'
为空格)应该不会出现问题,但这是在形成像scanf
格式字符串这样简单的内容时必须经过的思考过程
养成每次计算输入流中所有字符的习惯。这样你就不会因为一些你无法解释的错误而措手不及
要允许输入包含空格,可以使用scanf
的字符类格式说明符。例如,您可以使用%99[^\n]“
作为格式字符串。但是,字符类不会自动忽略前导空格,但您可以通过在格式说明符开头的%
前面留出空格来提供这种灵活性,例如%99[^\n]“
。这很重要。(这也是为什么在处理用户输入时,fgets
或POSIXgetline
通常优于scanf
的原因
现在,如何处理留在输入缓冲区中的'\n'
(例如此处的stdin
)?除了留下空间
,还可以在格式字符串中使用赋值抑制运算符。%99[^\n]*c
字符%*c
是一种用于读取字符%c
的格式说明符,但是通过包含'*'
(赋值抑制运算符),可以告诉scanf
读取并丢弃字符
在接受用户输入时,仅仅提供正确的格式说明符是不够的。您必须验证您是否实际收到了预期的输入。对于任何输入例程,这至少意味着检查scanf
(或fgets
或getline
等)的返回值。对于scanf
,返回的是“匹配计数”,它是根据格式字符串执行的成功转换数。例如%s
(或%[^\n]
)构成对单个转换的请求。(与赋值抑制运算符关联的任何转换都不包括在匹配计数中)因此,您的预期回报是格式字符串中的转换次数。综合起来,您可以通过以下方式处理inputtext
:
printf ("What should be written in the text file? "); /* prompt */
/* validate user input -- limit to 99 chars (+1 for nul char) */
if (scanf (" %99[^\n]%*c", inputtext) != 1) {
fprintf (stderr, "error: invalid input (inputtext).\n");
return 1;
}
同样的事情对filename
?答案:否。为什么?您计划在用户输入后将.txt“
添加到文件名
,对吗?.txt”
中有多少个字符?答案:4
(您只有1
nul字符)
printf ("What should be written in the text file? "); /* prompt */
/* validate user input -- limit to 99 chars (+1 for nul char) */
if (scanf (" %99[^\n]%*c", inputtext) != 1) {
fprintf (stderr, "error: invalid input (inputtext).\n");
return 1;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { MAXC = 100 };
int main (void) {
/* declare and initialize variables */
char filename[MAXC] = "", inputtext[MAXC] = "";
FILE *fp = NULL;
printf ("What is the .txt file name? "); /* prompt */
/* validate user input -- limit to 95 chars */
if (scanf (" %95[^\n]%*c", filename) != 1) {
fprintf (stderr, "error: invalid input (filename).\n");
return 1;
}
strcat (filename, ".txt"); /* +4 chars = 99 chars */
/* open file/validate file open for reading */
if (!(fp = fopen (filename, "w"))) {
fprintf (stderr, "error: file open failed '%s'.\n", filename);
return 1;
}
printf ("What should be written in the text file? "); /* prompt */
/* validate user input -- limit to 99 chars (+1 for nul char) */
if (scanf (" %99[^\n]%*c", inputtext) != 1) {
fprintf (stderr, "error: invalid input (inputtext).\n");
return 1;
}
/* output status to stdout & inputtext to fp */
printf ("\nwriting to '%s'\n%s\n", filename, inputtext);
fprintf (fp, "%s\n", inputtext);
if (fclose (fp)) /* close file - validate stream close */
fprintf (stderr, "error: on file stream close.\n");
return 0;
}
$ ./bin/inputtext
What is the .txt file name? dat/inputtext
What should be written in the text file? A quick brown fox jumps over the lazy dog.
writing to 'dat/inputtext.txt'
A quick brown fox jumps over the lazy dog.
$ cat dat/inputtext.txt
A quick brown fox jumps over the lazy dog.