2016-03-27 10 views
-2

C++ dosyasında csv dosyası ayrıştırıcısı yazıyorum. Dosya virgülle ayrılmış ve hem basit hem de sayısal değerlere sahip olabilir. Nümerikler için anında ikiye dönüştürebilmek istiyorum. Bu yüzden char * start ve int uzunluğum var ama char dizisinin bir kısmı boş değil. Öncelikle dizgeye dönüştürmeden char * 'ı ikiye dönüştürmenin hızlı bir yolu var mı?C++ char dizisi sıfır değil çift verilen başlangıç ​​ve uzunluk için sonlandırıldı

+0

Bazı araştırmalar gerçekleştirin. –

+0

Standart kütüphanede bildiğim hiçbir şey senin vakanı kapsıyor. std :: strtod 'muhtemelen en yakın olanıdır, çünkü nerede bittiğini test edebilirsin, ama yine de bazı ciddi tanımlanmamış davranışlarla sonuçlanırdı çünkü er ya da geç tamponun bir sayının sonunu arar. – user4581301

+0

@ user4581301: Belleğimde "istringstream" adlı bir kütüphane nesnesi var, ancak ne yaptığını hatırlayamıyorum. Belki de yukarı bakar mısın? –

cevap

0

@ThomasMatthews için güncelleme comment: Bunun için bir C++ akışı kullanabilir ve özel bir buffer sınıfı yaparsanız, bir dizgeye dönüştürmeyi engelleyebilirsiniz (aslında olduğu gibi, daha önce bir cevap yazmıştım) :

Get an istream from a char*

görünüşe göre, burada üzerine Geliştirilmiş: C tarzı çözüm için

Creating an input stream from constant memory

, lea de st bir proje standart strtod() bir analog olarak uygulanır, ve böyle bir fonksiyon strntod() seçti:

https://github.com/client9/season/blob/3a900563595a114fe9f33cf55caa326bd87d94f8/strntod.c

Bu user4581301 @ ile bahsedilen bu, söz konusu atıf strtol() olmayan standart strntol() varyantı paralel:

Eğer bir dize var ve sadece uzunluk geçmiş noktada bir null yok ... ve eğer

Is there a strtol equivalent that does not require a null-terminated string?

ve hack için , nedense bunu mutabl olmak tanıyor Değiştirmek için güvenli olan bir bellek ... bu noktada geçici olarak \0'u kandırabilirsiniz. strtod()'u çalıştırın ve eski karakteri geri koyun. : -/

İlgili konular