2009-08-31 30 views
3

我有点想知道如果我失去了我的想法,但我发誓,这个代码输出笑脸作为.name值!世界正在发生什么?到目前为止,它似乎只有在值为1时才有效,其他任何事情都可以正确地给出错误。将不正确的值类型分配给struct属性时的笑脸!

我意识到代码有缺陷 - >我不需要帮助。

#include <iostream> 
#include <fstream> 
#include <regex> 
#include <string> 
#include <list> 

using namespace std; 
using namespace tr1; 


struct CollectedData 
{ 
public: 
    string name; 
    float grade; 

}; 

int main() 
{ 
    string line; 
    list<CollectedData> AllData; 
    int count; 

    ifstream myFile("test_data.txt"); 
    if (myFile.fail()) {cout << "Error opening file"; return 0;} 
    else 
    { 
     cout << "File opened... \n"; 
     while(getline(myFile, line)) { 
      CollectedData lineData; 
      lineData.name = 1; 
      lineData.grade = 2; 
      AllData.push_back(lineData); 
     } 
    } 

    cout << "\n\n File contents: \n"; 

    list<CollectedData>::iterator Iterator; 
    for(Iterator = AllData.begin(); 
      Iterator != AllData.end(); 
      Iterator++) 
    { 
     cout << "\t" << (*Iterator).name << " - "; 
     cout << "\t" << (*Iterator).grade << "\n"; 
    } 


    getchar(); 
    return 1; 
} 

:-) http://img21.imageshack.us/img21/4600/capturekjc.jpg

我知道这些代码是没用的,
我想知道为什么它给我笑脸INSTEAD错误

欣慰的。 。 。嘲讽

+4

笑脸是字符0x01。 – LiraNuna 2009-08-31 02:35:33

+5

+1,情况和轻微的愤怒让我发笑。 – Corey 2009-08-31 03:02:29

+0

代码表:http://en.wikipedia.org/wiki/Code_page_437#Characters – mark4o 2009-08-31 03:07:09

回答

8

笑脸是ASCII值为1的字符。不知道为什么,但显然你的编译器决定把它当作字符,所以你得到了笑脸。

+2

笑脸不是一个ASCII字符。它在IBM-PC(MS-DOS代码页437)集中。 – mark4o 2009-08-31 15:05:01

6

你的问题是在这里:

lineData.name = 1; 
lineData.grade = 2; 

我要指出,你得到的符号是ASCII 1(即,正是你设置什么lineData.name到)。

while(getline(myFile, line))

你需要走线和解析它,将适当的字符串转换成lineData.name,并插入一个整数到lineData.grade。

+0

它与null终止无关。 – 2009-08-31 02:40:24

+0

我从“面孔”中推断出有多个,一个接一个。在重读这个问题时看起来这是一个错误的假设,所以我编辑了答案。 – 2009-08-31 02:45:38

+0

另外,当我发布时,我在一个阻止图像的代理之后。所以我用我得到的信息做了。 – 2009-08-31 06:28:38

3

字符串被分配一个字符值(1),这恰好是ASCII字符集中的笑脸。

9

我想知道为什么它给我笑脸INSTEAD误差的

由于数据类型为string,与焦炭0x01打印笑着脸。您可能需要指定值0x31,而不是ASCII码中的字符1

+7

或值'1',这是一个可移植的写字符1 – MSalters 2009-08-31 07:58:37

2

像其他人说的名字是string类型的,所以这将是最好的分配字符串给它:

lineData.name = "1"; 

引号将让编译器知道这个值是一个字符串,而你将停止得到笑脸。

那说...

最酷。错误。永远。

相关问题