从文件C ++中读取

时间:2013-05-25 10:57:17

标签: c++ fopen fgets

我想只读取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 个答案:

答案 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?