两条流干扰c

时间:2017-05-16 15:17:16

标签: c file-io stream

以下代码为我提供了一个带有“s”的文件。

main () {
    FILE *ptr_TextOut;
    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;
    }

    character = 's';

    fputs(&character, ptr_TextOut);
    fclose(ptr_TextOut);

    return 0;
}

但是,当打开第二个流时,如下面的代码我在文件中得到“sË-,”。

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的先前版本,但得到相同的结果。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

fputs()接收以空字符结尾的字符串,而不是与fputc()不同的字符。

  

在计算机编程中,以null结尾的字符串是一个字符串,存储为包含字符的数组,并以空字符('\0'结尾,在ASCII中称为NUL)。

您将指向该字符的指针作为参数,该指针没有null来终止它,这会导致未定义的行为。

  

该函数从指定的地址(str)开始复制,直到到达终止空字符(' \ 0')。此终止空字符不会复制到流中。

char character = 'c';替换为char* word = "c";。这将使用指向以null结尾的字符串的指针,而不是char原语。

此外,您需要将对fputs()的呼叫更改为:

fputs(word, ptr_TextOut); // No need to reference the input (&)

或者,只需使用fputc(character, ptr_TextOut);

解释您的输出

在执行程序的底层内存结构上,变量可能存储在另一个旁边。 因此,如果巧合的话,另一个变量的位置就在字符变量之后并且在其中为空,它将有效地终止字符串。 这可能发生在第一个程序中,但不是在第二个程序中。