所以,我试图创建一个简单的程序来创建一个新文件,并使用fopen()
将用户输入的任何内容放入一个新创建的文件中。
它编译好了,但是当试图实际写东西并点击进入程序关闭时出现某种错误 - 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;
}
答案 0 :(得分:2)
有很多关于这段代码的东西是可疑的,从玩具C程序中一堆非标准,不相关和/或C ++标题的出现开始,到getchar()
结尾 - 紧接在退出反模式之前,但让我们关注即时错误:
FILE*out = fopen("improvements.txt", "w");
如果由于某种原因,此操作发生失败,fopen
将返回一个空指针,您不检查该指针。在C语言编程时,您负责检查库例程是否失败。因为你没有,后来fprintf
崩溃了程序。
您应该在fopen
行后立即添加此代码:
if (!out)
{
perror("improvements.txt");
return 1;
}
这将导致程序打印错误消息,并在fopen
失败时退出。错误消息的文本应该告诉您为什么 fopen
失败。
答案 1 :(得分: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
描述符不是%c
的字符串。此外,如果艺术家字符串将包含空格..那么scanf
将失败..以避免尝试使用fgets
答案 2 :(得分:1)
您是在尝试读取字符串还是单个字符?
&#39;%C&#39;用于读取单个字符。 如果您需要阅读字符串,则应使用&#39;%s&#39;。