C++ - 使用代码块从文件中读取 IP 地址

C++ - Using codeblock to read ip adress from a file

本文关键字:文件 读取 IP 地址 代码 C++      更新时间:2023-10-16

我一直在尝试从文件中取出IP地址,以及其他一些参数。一开始我想提一下,我的积分不到 10 分,而且我无法上传图片 - 这就是为什么我将提供图片链接的原因。

这是我从中读取的配置文件的屏幕截图: https://pasteboard.co/IpyYdxd.png

我的代码将端口、datagram_size和transmission_speed作为 int 变量,将它们与我的 udp 套接字实现一起使用没有问题。但是,它不允许我使用我的 GROUP 变量,它是 std::basic_string 类型,因为它需要 const char* 变量。

以下是我的控制台应用程序的视图: https://pasteboard.co/Ipza3hON.png

我尝试使用 value.c_str() 函数将字符串/整数转换为常量字符,但是出了点问题。

// FILE TO BE SEND
FILE *file_handler; 
if((file_handler = fopen("output_file.dat", "rb")) == NULL)
{
printf("Error: unable to read filen");
exit(-1);
}

char buf[DATAGRAM_SIZE];
int i = 0;
// CONFIGURATION FILE
std::ifstream cFile ("plik_konfiguracyjny.txt"); 
if (cFile.is_open()){
std::string line;
set_light_red // set color to light red
while(getline(cFile, line)){
line.erase(std::remove_if(line.begin(), line.end(), isspace),line.end());
if(line[0] == '#' || line.empty()){ // if line starts with # or is empty - ignore
continue;
}
auto delimiterPos = line.find("=");
auto name = line.substr(0, delimiterPos);
auto value = line.substr(delimiterPos + 1);
printf(value.c_str()); // display received value from current line
printf("n");
printf("zmienna i: %in",i); // display i to check what's the value in current loop
if(i == 0){
group = value.c_str(); // CONVERT STRING TO CONST CHAR*
}
if(i == 1){
port = std::stoi(value);
}
if(i == 2){
DATAGRAM_SIZE = std::stoi(value);
}
if(i == 3){
wait_for = std::stoi(value);
}
i = i +1;
}
set_white
printf("PARAMETRY TRANSMISJI ");
set_green
printf("ZALADOWANEnn");
set_white
}
else {
printf("PARAMETRY TRANSMISJI ");
set_red
printf("NIEZALADOWANEnn");
set_white
}
// create UDP with parameters from file
memset((char *) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(group);
addr.sin_port = htons(port);

没有错误,并且可以正常编译,但是它不会在给定文件中使用IP地址。

这是我的意思是用图片(和出色的绘画技巧)显示 https://pasteboard.co/IpzacMF.png

我们无法判断group是什么。可能是char *,可能是std::string,也可能是别的东西。

但是您的评论表明group属于const char *型.如果这是正确的,那么group = value.c_str();没有任何意义。为什么要将group设置为指向内容不断变化的缓冲区?是的,它在这一秒包含主机,但它即将被循环的下一次迭代覆盖。为什么要隐藏指向它的指针?

如果value的内容在循环的下一次迭代中大小增加,并且std::string的内部实现释放了现有缓冲区并分配了一个新的、更大的缓冲区,该怎么办?现在,group指向一个甚至不再分配的缓冲区!

不要存储来自c_str的返回值,并在修改字符串后尝试访问它。