2015-09-26 95 views
0

我正在讀取文件,並且正在使用提取操作符來獲取第一個值。問題是我需要知道如果值是一個int或一個字符串,所以我可以把它放在適當的變量。使用文件提取操作符讀取int或字符串

所以我的問題是我可以嘗試把它放在一個int,如果它失敗它會把它扔在一個字符串?或者事先檢查它是一個int還是一個字符串?

如果需要,我可以提供代碼/ psudocode。

文件例如:

3 rows 3 columns all @ go 
     5 columns 6 rows go 
     5  rows  triangular  go 
alphabetical 3 rows 3  columns go 
all ! 4 rows 4 columns outer  go 
alphabetical  triangular  outer  5 rows go 
+0

你是什麼意思的「第一價值」?例如,如果該文件讀取「foo.123」,是「foo.123」的第一個值?或者是「foo」。第一個和「123」第二個?或者是什麼?你需要以足夠的精度指定你想要的東西,否則唯一有用的答案就是「實現你想要的任何東西」。 –

+0

首先是foo,然後是123這樣:edd 123 fed 1 dwd。我想看看哪些是字符串,哪些是int。 – SaladSnake

+0

所以你想閱讀一系列由空白分隔的字符串,並看看它們中的哪些僅由數字組成? –

回答

2

有很多方法可以做到這一點,一個是簡單地閱讀它作爲一個字符串,並嘗試分析它在自己的代碼的整數。如果解析成功,那麼你有一個整數,否則你有一個字符串。

有解析字符串,其中包括幾個方面(但不限於):

  • 使用std::istringstream>>運營商,並檢查流標誌
  • std::stoi
  • 編程方式檢查所有字符都是數字,用普通的十進制算術進行轉換

簡單的例子使用std::stoi

std::string input; 
if (std::getline(std::cin, input)) 
{ 
    try 
    { 
     std::size_t pos; 
     int n = std::stoi(input, &pos); 

     // Input begins with a number, but may contain other data as well 
     if (pos < input.length()) 
     { 
      // Not all input was a number, contains some non-digit 
      // characters as position `pos` 
     } 
     else 
     { 
      // Input was a number 
     } 
    } 
    catch (std::invalid_argument&) 
    { 
     // Input is not a number, treat it as a string 
    } 
    catch (std::out_of_range&) 
    { 
     // Input is a number, but it's to big and overflows 
    } 
} 

如果你不想使用異常,那麼舊的C函數std::strtol可以用來代替:

std::string input; 
if (std::getline(std::cin, input)) 
{ 
    char* end = nullptr; 
    long n = std::strtol(input.c_str(), &end, 10); 

    if (n == LONG_MAX && errno == ERANGE) 
    { 
     // Input contains a number, but it's to big and owerflows 
    } 
    else if (end == input.c_str()) 
    { 
     // Input not a number, treat as string 
    } 
    else if (end == input.c_str() + input.length()) 
    { 
     // The input is a number 
    } 
    else 
    { 
     // Input begins with a number, but also contains some 
     // non-number characters 
    } 
} 
+0

對stoi和istringstream做了一些研究。你可以給我什麼機會,以及這可能如何工作的例子? – SaladSnake

+0

阿哈我看到嘗試趕上!萬分感謝!! – SaladSnake

1

這樣做的標準方式是由1個字符的前瞻

int nextInt() 
{ 
    std::stringstream s; 
    while (true) 
    { 
     int c = getch(); 
     if (c == EOF) break; 
     putch(c); // remove if you don't want echo 

     if isDigit(c) 
      s << (char)c; 
     else if (s.str().length() > 0) 
      break;   
    } 

    int value; 
    s >> value; 
    return value; 
} 

你應該能夠轉換這個例子來重複文件中所有「單詞」的過程。

+0

基本上,你所做的是...如果我剛剛得到一個int,並且下一個char不是int(使用peek),那麼將一個int放到std out並開始讀取一個字符串。 – Duane

+0

我正在閱讀文件而不是用戶輸入。說包含的文件:tyyr 54 dhh我想用:myFile >> x抓住「tyyr」並檢查它是否爲int。將與isdigit(x)一起工作,還是會遇到編譯問題,因爲我試圖把一個字符串放入一個int var? – SaladSnake

+0

@Duane:不要4get,非數字可以以數字開頭。 – Hurkyl