2009-12-22 14 views
8

Estoy tratando de utilizar nombres de archivo como la clave en boost::PropertyTreeBoost Árbol de la propiedad con nombre de archivo como clave

Sin embargo, el '' el carácter en un nombre de archivo como "ejemplo.txt" hace que se agregue una capa adicional dentro del árbol de propiedades. La solución más obvia sería reemplazar '.' con otro personaje, pero es probable que haya una mejor manera de hacerlo, como con un personaje de escape.

En el siguiente ejemplo, el valor 10 se colocará en el nodo 'txt', un elemento secundario de 'example'. En cambio, quiero que el valor 10 se almacene en el nodo 'example.txt'.

ptree pt; 
pt.put("example.txt", 10); 

¿Cómo puedo usar el nombre completo de un solo nodo?

Gracias de antemano por su ayuda!

+0

Un lado: Usar nombres de archivo como claves es complicado. ¿Has considerado lo que sucede cuando hay enlaces duros? Enlaces simbólicos? ¿Cambios de nombre que ocurren fuera de su proceso? ¿Insensibilidad a las mayúsculas y minúsculas en Windows? ¿El hecho de que Windows trunca espacios finales en nombres de archivos? – asveikau

+0

Afortunadamente esto es para una operación de solo lectura con la condición de que el contenido del directorio no cambie durante esta operación. Sin embargo, le agradezco que señale las preocupaciones adicionales. –

+0

Mi punto es que algunas de estas cosas (como la existencia de enlaces) podrían causar falsos negativos. Es algo a tener en cuenta, especialmente si usa esto para algún tipo de característica de seguridad. – asveikau

Respuesta

5

El problema era que la documentación no estaba actualizada. Un objeto de tipo de ruta debe ser creado de la siguiente manera, con otro carácter que no es válido para las rutas de archivos especificados como delimitador de la siguiente manera:

pt.put(boost::property_tree::ptree::path_type("example.txt", '|'), 10); 

He encontrado un camino a la solución de la lista de correo de impulso en el gmane grupo de noticias. comp.lib.boost.devel publicado por Philippe Vaucher.

9

basta con insertar el árbol de forma explícita:

pt.push_back(ptree::value_type("example.txt", ptree(10))); 

put El método es simplemente allí por conveniencia, por lo que automáticamente analiza . como una capa adicional. La construcción del valor_type explícitamente como he mostrado anteriormente evita este problema.

Una forma alternativa de resolver el problema es utilizar un argumento adicional en put y get, que cambia el delímetro.

pt.put('/', "example.txt", "10"); 
pt.get<string>('/', "example.txt"); 

Para el registro, nunca he usado esta clase en mi vida. Obtuve toda esta información directamente desde la página a la que vinculó;)

+0

Pequeño error en su línea, necesita ser pt.push_back (ptree :: value_type ("example.txt", ptree ("10"))); Esto también plantea la pregunta, ¿cómo puedo obtener este niño ahora que la operación get también falla debido al '.' personaje, y ¿cómo lo pongo sin darle un valor de datos como example.txt> wordCount> 10? –

+0

Edité mi publicación para responder a tu pregunta. –

+0

Desafortunadamente, put no admite delimitadores alternativos. así que pt.put ('/', "example.txt", "10"); no se puede utilizar. Mientras que hice el reemplazo de '.' con otro personaje fuera de la función, no parece que esté integrado. –

Cuestiones relacionadas