2010-03-31 42 views
1

我有一個如下所示的數字列表:1.234D+11.234D-02。我想用C讀取文件。功能atof只會忽略D並只翻譯尾數。使用「D」而不是「E」讀取ASCII碼用科學計數法使用C

函數fscanf將不接受格式'%10.6e',因爲它指望E而不是指數中的D

當我在Python中遇到這個問題時,我放棄了,只是在將字符串轉換爲float之前使用了字符串替換。 但是在C中,我確信肯定還有另一種方式

那麼,如何讀取一個數字爲D而不是E的文件作爲科學計數?請注意,我不是指如何自己讀取字符串,而是如何將它們轉換爲浮點數。

謝謝。

回答

1

您可以採取的strtodstrtok優勢:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    char in[] = "1.234D+1 ABCD 1.234D-02 5\n"; 
    char *cursor; 
    char *endp; 
    for (cursor = strtok(in, " "); cursor; cursor = strtok(NULL, " ")) { 
     double d = strtod(cursor, &endp); 
     if (*endp == 'D') { 
      *endp = 'e'; 
      d = strtod(cursor, &endp); 
     } 
     if (endp != cursor) { 
      printf("%e\n", d); 
     } 
    } 
    return 0; 
} 

輸出:

E:\> cnv 
1.234000e+001 
1.234000e-002 
5.000000e+000
+0

我很失望,C缺乏使用'D'而不是'E'讀取科學記數法的原生支持。你提出的代碼是最接近完美解決方案的。謝謝! – Escualo 2010-04-01 17:05:02

+3

@Arrieta:我很失望,它不能解析出字母Q出現而不是數字0(零)的數字。似乎圖書館設計人員不明白我們的要求對於如此多的計劃有多麼重要...... ;-) – 2012-06-22 12:14:04

1

用E代替D,通過沿着字符串循環。然後atof

0

下面這個函數是用 「d」 來代替 「d」 到 「E」 中的科學記數法。

std::string dToE(string cppstr) 
{ 
    str1.replace(cppstr.find("D"),1,"E"); 
    return cppstr; 
} 

如果科學記數法的C字符串被定義爲: 字符* CSTR = 「1.2D + 03」; 或通常通過strtok方法獲得,該方法返回C字符串,然後用atof(dToE(string(cstr)).c_str())得到帶有「E」的科學記數法。

由於atof只接受C風格字符串,您應該使用c_str()字符串方法將C++字符串轉換爲C字符串。

相關問題