0

我只想读取 IP 并在没有空格的情况下打印它们。这是我的代码的一部分:

 char buffer[256]
    dns_serv = fopen("dns_servers.conf", "rt"));
    log = fopen("logfile", "at")) ; 
    if (!fgets(buffer,sizeof(buffer), dns_serv)) {
                break;
            }       

            if (buffer[0] == '#') continue;
            if (buffer[0] == '\n') continue;

                if ((sockdns = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                printf("Error\n");
                continue;
            }

            fprintf(log, "; %s - %s %s",buffer,argv[1], argv[2]);

这在日志文件上写给我:

; 141.85.128.1
 - google.com SOA

但我想把它写在同一行:

 ; 141.85.128.1 - google.com SOA

我的错误在哪里?这是 dns_servers.conf:

# first example
141.85.128.1

# another
# 61.34.189.250
4

4 回答 4

2

这是使用标准 C++ 库为您提供的解决方案,因此:

#include <fstream>
using namespace std;

下一个而不是:

dns_serv = fopen("dns_servers.conf", "rt"));
log = fopen("logfile", "at")) ; 

写:

ifstream dns_serv("dns_servers.conf", std::ifstream::in);
ofstream log("logfile", std::ofstream::out | std::ofstream::app);

代替:

if (!fgets(buffer,sizeof(buffer), dns_serv)) {
            break;
        }

写:

dns_serv.getline (buffer, sizeof(buffer));
if (dns_serv.fail ()) break;

最后而不是:

fprintf(log, "; %s - %s %s",buffer,argv[1], argv[2]);

写:

log << "; " << buffer << " - " << argv[1] << " " << argv[2]; // << endl;

希望它对你有所帮助:) 我知道我毁了你的 C 风格,但一点 C++ 纪律也不错。;)

于 2013-05-25T12:04:59.177 回答
1

fgets'\n'(行尾)字符放入其输入缓冲区。您应该删除它(但要注意'\n'没有放入缓冲区的情况,例如,当行对于给定缓冲区而言太长并且fgets在到达行尾之前停止读取,或者因为fgets到达文件末尾)。

于 2013-05-25T11:06:34.463 回答
0

这是因为您还输出了'\n'缓冲区中包含的行尾(由 fgets 检索)

您需要将其从字符串中删除,执行以下操作:

  int len;

  len = strlen(buffer);
  buffer[len - 1] = '\0';

当然,添加更多检查可能是明智之举。并且可能使用字符串类使用更多的面向对象的方法。

于 2013-05-25T11:08:31.443 回答
0

此代码不会包含'\n'在字符串的末尾。

C++ 代码:

#include <iostream>
#include <fstream>
using namespace std;

string line;
ifstream dns_serv ("dns_servers.conf");
ofstream log ("logfile");
if(dns_serv.is_open())
{
     while(dns_serv.good())
     {
          getline(dns_serv,line);
          if(line.at(0)=='#' || line.at(0)=='\n') continue;
          cout << line << endl;
          log << "; " << line << " - " << argv[1] << " " << argv[2] << endl;       
     }                       
}
dns_serv.close();
log.close();

另外,您可以使用一些字符串修剪功能来删除多余的空格。看到这个修剪 std::string 的最佳方法是什么?

于 2013-05-25T11:46:55.177 回答