将不正确的值类型分配给struct属性时的笑脸!
我有点想知道如果我失去了我的想法,但我发誓,这个代码输出笑脸作为.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错误
欣慰的。 。 。嘲讽
笑脸是ASCII值为1的字符。不知道为什么,但显然你的编译器决定把它当作字符,所以你得到了笑脸。
笑脸不是一个ASCII字符。它在IBM-PC(MS-DOS代码页437)集中。 – mark4o 2009-08-31 15:05:01
你的问题是在这里:
lineData.name = 1;
lineData.grade = 2;
我要指出,你得到的符号是ASCII 1(即,正是你设置什么lineData.name到)。
while(getline(myFile, line))
你需要走线和解析它,将适当的字符串转换成lineData.name,并插入一个整数到lineData.grade。
它与null终止无关。 – 2009-08-31 02:40:24
我从“面孔”中推断出有多个,一个接一个。在重读这个问题时看起来这是一个错误的假设,所以我编辑了答案。 – 2009-08-31 02:45:38
另外,当我发布时,我在一个阻止图像的代理之后。所以我用我得到的信息做了。 – 2009-08-31 06:28:38
字符串被分配一个字符值(1),这恰好是ASCII字符集中的笑脸。
我想知道为什么它给我笑脸INSTEAD误差的
由于数据类型为string
,与焦炭0x01
打印笑着脸。您可能需要指定值0x31
,而不是ASCII码中的字符1
。
或值'1',这是一个可移植的写字符1 – MSalters 2009-08-31 07:58:37
像其他人说的名字是string类型的,所以这将是最好的分配字符串给它:
lineData.name = "1";
引号将让编译器知道这个值是一个字符串,而你将停止得到笑脸。
那说...
最酷。错误。永远。
笑脸是字符0x01。 – LiraNuna 2009-08-31 02:35:33
+1,情况和轻微的愤怒让我发笑。 – Corey 2009-08-31 03:02:29
代码表:http://en.wikipedia.org/wiki/Code_page_437#Characters – mark4o 2009-08-31 03:07:09