我想只读取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
答案 0 :(得分: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 ++规则并不坏。 ;)
答案 1 :(得分:1)
fgets
将'\n'
(行尾)字符放入其输入缓冲区。你应该删除它(但要注意'\n'
没有被放入缓冲区的情况,例如当一条线对于给定的缓冲区来说太长而且fgets
在它到达行尾之前停止读取,或者因为fgets
到达文件末尾。
答案 2 :(得分:0)
这是因为您还在缓冲区中包含的行末尾输出'\n'
(由fgets检索)
您需要将其从字符串中删除,执行类似的操作:
int len;
len = strlen(buffer);
buffer[len - 1] = '\0';
当然,添加更多支票可能是明智之举。也许可以使用字符串类更多的OO方法。
答案 3 :(得分: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();
在额外的情况下,您可以使用一些字符串修剪功能来删除多余的空格。 请参阅此What's the best way to trim std::string?