【问题标题】:Unable to save string to log.txt无法将字符串保存到 log.txt
【发布时间】:2014-11-01 21:13:29
【问题描述】:

我正在制作一个聊天程序,它使用recvsend 通过套接字发送和接收信息。现在我正在尝试添加一个函数,以便它自动将聊天日志保存到文件中。就我现在所拥有的而言,它只会打开/创建文件,但不会向其中写入任何内容。

在第 46 行,它在聊天中打印“收到的消息”和第 63 行打印“自己的消息”。谁能发现我的错误?

  int ThereAndBackAgain(SOCKET *clientSocket){
    char keyPress ='\0',tmp[200]={0};
    int index=0, i = 0;
    FILE *fp;
    char buffer[256];
    char nickName[10] = "Sneep";
    memset(&buffer[0], 0, sizeof(buffer));
    fp = fopen("chatlog.txt", "a");
    do{
        while(!kbhit()){

            if (recv(*(clientSocket), buffer, 255,0) != -1){

                printf("%s: \n",nickName);
                printf("%s\n", buffer); //Prints received messages

                fputs(buffer, fp);

                memset(&buffer[0], 0, sizeof(buffer));
                i = 0;
            }
        }
        if(keyPress=tmp[index++]=getch()){
            if(keyPress == '\r'){ // if user presses enter

                for(i = 0; i < strlen(buffer); i++){
                    if (i == 0)
                        printf("\b ");
                    else
                        printf("\b\b ");
                }
                i = 0;
                //print the message to a good spot on the screen
                printf("\b%s\n",buffer); // Prints own messages
                send(*(clientSocket),buffer,strlen(buffer),0);
                memset(&buffer[0], 0, sizeof(buffer));
            }
            buffer[i] = keyPress;
            printf("%c", keyPress);
            if(keyPress == '\b'){ // if user presses backspace
                printf(" \b");
                buffer[i-1] = ' ';
                i--;
            }
            else{
                i++;
            }
        }

    }while(buffer[0] != '#');

  }

【问题讨论】:

  • 次要注意:避免在循环中每次调用strlen()size_t len = strlen(buffer); for(i = 0; i &lt; len; i++) {

标签: c file sockets save fwrite


【解决方案1】:

文件被创建是因为fopen 创建了文件。但是,在您执行fclose(fd) 之前不会保存数据。 C99 保证如果程序以returnexit() 结束,所有打开的文件都将关闭。

所以,如果..,你不应该看到任何东西。

  1. ...您正在使用 SIGINT (Cntl+C) 关闭您的程序。
  2. ...打开文件时程序仍在运行。

【讨论】:

  • 哇,我不知道!在我关闭程序之前有什么办法让它保存吗?
  • 是的,你可以尝试打开文件并为每个新的追加关闭它:fp = fopen("chatlog.txt", "a"); fputs(buffer, fp); fclose(fp);
  • 您也可以在不使用fflush(fp); 关闭文件的情况下强制执行此操作。所以你可以这样做:fputs(buffer, fp); fflush(fp)。欲了解更多信息,请查看fflush
猜你喜欢
  • 2018-12-08
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多