0

IPのみを読み取り、空白なしでそれらを印刷したい.Hereは私のコードの一部です:

 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();

extra では、いくつかの文字列トリミング関数を使用して、余分な空白を削除できます。これを参照std::string をトリミングする最良の方法は何ですか?

于 2013-05-25T11:46:55.177 に答える