以下代码为我提供了一个带有“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的先前版本,但得到相同的结果。谢谢你的帮助。
答案 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);
。
在执行程序的底层内存结构上,变量可能存储在另一个旁边。 因此,如果巧合的话,另一个变量的位置就在字符变量之后并且在其中为空,它将有效地终止字符串。 这可能发生在第一个程序中,但不是在第二个程序中。