Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 试图创建txt文件,但表示无法打开文件_C_File_Text_Null - Fatal编程技术网

C 试图创建txt文件,但表示无法打开文件

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

对编程非常陌生。我试图创建一个txt文件,要求用户输入文件名,然后输入文件文本。起初,我得到了一个关于null的错误,所以我放了一个if语句,似乎代码无法打开具有该名称的文件。试图做一些研究,最后做了一些改变,但仍然导致了同样的错误

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
或POSIX
getline
通常优于
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.