0

所以,我尝试创建一个简单的程序来创建一个新文件,并将用户键入的任何内容放入一个新创建的文件中,使用fopen().

它可以编译,但是当尝试实际编写一些东西并按 Enter 时,程序会因某种错误而关闭 - Debug Assertion failed,Expression(stream!=null)- 我试图用谷歌搜索,人们说当文件与 .cpp 不在同一个文件夹中时会发生这种情况/.c 文件。但是,这应该不是问题,因为我尝试创建文件对吗?感谢您的任何提示;)。

#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <string.h>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    FILE*out = fopen("improvements.txt", "w");
    // FILE*file = fopen("data.txt", "r");
    char artist[256];
    printf(" What do you wish to add to the new file ?\n");
    scanf("%c", artist);
    fprintf(out, "%c", artist);

    // fclose(file);
    fclose(out);

    getchar();
    return 0;
}
4

3 回答 3

2

这段代码有很多值得怀疑的地方,从玩具 C 程序中出现一堆非标准、不相关和/或 C++ 头文件开始,到getchar()-immediately-before-exiting 反模式结束,但是让我们关注直接错误:

FILE*out = fopen("improvements.txt", "w");

如果出于某种原因,此操作碰巧失败,fopen将返回一个空指针,您不会检查它。在 C 中编程时,您负责检查库例程是否失败。因为你没有,后来fprintf程序崩溃了。

您应该在该行之后立即添加此代码fopen

if (!out)
{
    perror("improvements.txt");
    return 1;
}

这将导致程序打印错误消息并在fopen失败时退出。错误消息的文本应该告诉您失败的原因。fopen

于 2013-11-05T21:45:52.143 回答
1

您是要读取字符串还是单个字符?

'%c' 用于读取单个字符。如果你需要读入一个字符串,你应该使用'%s'。

于 2013-11-05T21:47:43.250 回答
1

该错误意味着您正在尝试读取NULL指针。这意味着你fopen失败了。这就是为什么总是建议在之后进行错误检查fopen以确保不会发生这种情况。

尝试在 fopen 中给出文件的完整路径

  FILE *out = fopen("usr/Desktop/improvements.txt", "w"); // example path .. put a full path like this in your code

另外..艺术家是单个字符还是字符串?..如果是字符串,那么您的scanf也是错误的。

scanf%s读取带有描述符 not的字符串%c。此外,如果艺术家字符串将有空格..那么scanf将失败..以避免尝试读取字符串fgets

于 2013-11-05T21:44:25.843 回答