干扰c语言的两条流
下面的代码为我提供了一个包含“s”的文件 但是,当打开第二个流(如以下代码所示)时,我会在文件中看到“sË–vˇ”干扰c语言的两条流,c,file-io,stream,C,File Io,Stream,下面的代码为我提供了一个包含“s”的文件 但是,当打开第二个流(如以下代码所示)时,我会在文件中看到“sË–vˇ” main () { FILE *ptr_TextOut; FILE *ptr_CodeIn; char character; // Open TextOut ptr_TextOut=fopen("/Users/jonathanclark/Software Projects/C/Baffle/TextOut","w"); if (!p
main () {
FILE *ptr_TextOut;
FILE *ptr_CodeIn;
char character;
// Open TextOut
ptr_TextOut=fopen("/Users/jonathanclark/Software Projects/C/Baffle/TextOut","w");
if (!ptr_TextOut)
{
printf("Unable to open TextOut!");
return 1;
}
// Open CodeIn
ptr_CodeIn=fopen("/Users/jonathanclark/Software Projects/C/Baffle/CodeIn","r");
if (!ptr_CodeIn)
{
printf("Unable to open CodeIn!");
return 1;
}
character = 's';
fputs(&character, ptr_TextOut);
fclose(ptr_TextOut);
fclose(ptr_CodeIn);
return 0;
}
难道我不能同时打开两个流,或者我的代码中有其他错误吗?在这两种情况下,我都希望文件TextOut中出现“s”。如果相关的话,我正在MAC上运行我的代码。在再次运行之前,我尝试删除文件TextOut的早期版本,但得到了相同的结果。谢谢您的帮助。fputs()
接收以null结尾的字符串,而不是与fputc()
不同的字符
在计算机编程中,以null结尾的字符串是存储为包含字符的数组并以null字符结尾的字符串('\0'
,在ASCII中称为NUL)
您将指向该字符的指针作为参数,该参数没有null来终止它,这将导致未定义的行为
函数从指定的地址(str)开始复制,直到到达终止的空字符('\0')。此终止空字符不会复制到流中
替换char字符='c'代码>带有char*word=“c”代码>。这将使用指向以null结尾的字符串的指针,而不是char原语
此外,您还需要将对fputs()
的调用更改为:
fputs(word, ptr_TextOut); // No need to reference the input (&)
或者,只需使用fputc(字符,ptr_TextOut)代码>
解释您的输出
在执行程序的底层内存结构上,变量可能一个接一个地存储。
因此,如果另一个变量的位置恰好位于字符变量之后,并且其中包含null,那么它将有效地终止字符串。
这可能发生在第一个程序中,但不会发生在第二个程序中。main()
是无效的签名!您如何期望fputs
知道您只想输出一个字符?“无法打开CodeIn!”听起来像是一个错误。错误消息属于stderr。if(!ptr_CodeIn){perror(“/path”);return 1;)
不要忘记用换行符结束消息。不要忘记用现代C语言编写-这意味着您应该明确指定每个函数的返回类型,包括main()
(它应该返回int
)。您应该使用更复杂的编译选项,例如gcc-O3-g-std=c11-Wall-Wextra-Werror-Wmissing prototype-Wstrict prototype-Wold style definition…
。C语言中没有堆栈。@Olaf在没有参考程序的底层内存结构的情况下,我无法解释他得到的输出。我更改了答案,但是,为了更好地强调他做错了什么,而不是解释输出。有一个明显且符合要求的答案:未定义的行为。无需进一步研究,更不用说,因为我们不知道生成的机器代码(无论如何都是无关的)。我们不知道使用了堆栈。@Olaf From a“C”“你的观点是正确的。但事实上,我不知道还有任何其他现有的机器运行编译(C)代码而没有堆栈。我相信如果有人问这样的问题(显然是一个新代码),他/她应该知道是什么导致了这种输出。1)问题是关于C语言。2)你可能想拓宽你的视野。x86、ARM、MIPS、PPC和SPARC是非常少数的体系结构(并且数量比销售的设备少)。即使在这些体系结构上,实现也可能(所有现代人都会这样做)选择不对许多自动变量使用堆栈。3)我已经说过这一点,但mabe重复有帮助:如果标准足够,不要用具体的实现进行解释。
fputs(word, ptr_TextOut); // No need to reference the input (&)