首先,代码的布局非常混乱,就目前而言,它永远不会编译。您有一个input()
似乎从未调用过的函数,并且您将代码留在了函数之外,而这些代码应该在另一个函数中,或者更好的是,所有代码都应该包含在一个main()
函数中,以便可以执行它。这是您想要做的清理示例:
#include <stdio.h>
char in[80],out[80];
int main()
{
printf("Client: ");
scanf("%[^\n]",in); //you really should use fgets() here
FILE* fp = fopen("test.txt","w");
if (!fp)
{
perror("Failed to open file");
return 1;
}
fputs(in,fp);
fputs("\n",fp);
fclose(fp);
fp = fopen("test.txt","r");
if (!fp)
{
perror("Failed to open file");
return 1;
}
fgets(out,80,fp);
fclose(fp);
fp = fopen("test.txt","a+");
if (!fp)
{
perror("Failed to open file");
return 1;
}
if (strcmp ("Knock Knock\n",out)==0)
fputs("Server: Who is there?\n",fp);
return 0;
}
一些重要的注意事项:
1)fp
有一个 file-type FILE*
,因为那是 的返回fopen()
,但你从来没有这样声明它。所以这永远不会编译那个错误。
2)每次打开带有w
标志的文件时,它都会删除文件的全部内容。因此,如果您打算附加到文件以了解程序输出的历史记录,则需要a+
在调用时使用该标志fopen()
3) 如果您无法打开文件而不是在程序从stdin
. 此外,如果您要继续重新打开文件,请每次检查 NULL,因为尝试使用 NULL 文件指针(很可能是崩溃)会得到不可预测的结果。
4)scanf()
可能导致来自用户输入(或恶意用户输入)的令人讨厌的缓冲区溢出......改为fgets()
使用stdin
已知长度的缓冲区。
您现在应该能够编译并运行此代码。在 Ubuntu 上使用 gcc 4.4.3 为我工作。运行后,您的“test.txt”文件应如下所示:
Knock Knock
Server: Who is there?