干扰c语言的两条流

干扰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

下面的代码为我提供了一个包含“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 (!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 (&)