2011-09-24 88 views
0

我想从文件中读取一个数字,将其设置为公共变量在不同的类。正在读取文件的函数具有该类的指针对象实例。我现在面临一个奇怪的问题:使用的fscanf设置一个变量在不同的类

以下工作:

int dummy; 
fscanf(file,"%d",&dummy); // assume the file stores the number 10 

globals->var = dummy; 

cout << "variable is " << globals->var << endl; // this outputs 10 to console. great! 

但我将有很多的fscanf的做了,我不想创建所有的这些多余的dummy变量。我试过以下内容:

fscanf(file,"%d",&globals->var); 
cout << "variable is " << globals->var << endl; // this outputs 2.9e-321 (aka junk) 

是否有原因不起作用?我需要像globals->&var那样做,还是像这样的一些变化?我试图用括号括起来,如下所示:&(globals->var),但这也不起作用。是否有一个原因,这是行不通的(没有我必须粘贴许多许多行代码)

谢谢!

+0

我想我不知道如果我做一个C++的那种感觉什么“非法” ... – Amit

+1

不globals-> VAR是什么类型的? – fazo

+1

'var'的类型是什么?发布类的定义。 – Nawaz

回答

2

正如你在评论中所说的,var的类型是双倍的。是的,这是问题所在。你应该使用%f

除此之外,我会给你一个忠告:

使用C++流的I/O工作体型。它们是类型安全的。如果你使用它们,你将不会遇到你遇到的这个问题fprintf

这里是你应该如何使用它:

std::ifstream file("filename.txt"); 
file >> globals->var; //don't worry about whether var is int, or double! 

酷,不是吗?

+0

是的。非常感谢:) 10分钟后立即检查 – Amit

+0

我知道读取文件的C++流方式。虽然当你不得不从文件中读取大块数据时会感到有些恼火,但使用'fscanf'来更容易地声明好的标准C语言类型。但我同意,我通常会去C++流来做到这一点 – Amit

+0

@Amit:为什么使用C++流读大文件很烦人? – Nawaz

2

的问题是最有可能的是globals-> var是一个floatdouble将其转换为int或其他一些整数型,它应该工作

之所以它输出的“垃圾”是float/double数字以特殊方式编码。如果你只是用一个完全有效的整数覆盖内存,如:

double value = 0.0; 
*((int*)&value) = 42; 
// value is now something like 2.07508e-322 

你仍然会得到一个“奇怪”的数字。这是在%f作为参数的scanf内部发生的情况。

+0

实际上,如果不匹配类型和格式说明符,它会调用未定义的bevahiour。 – Nawaz

+0

即使是中途体面的编译器也应该告诉你,你已经这么做 - 如果你打开警告,那就是。不匹配的类型和格式说明符只是大多数编译器会捕获的许多未定义行为之一,如果您要求他们这样做。没有提出要求,各种不良行为都会通过未报告的方式漏掉。 –

+0

@DavidHammen:我已经打开了墙,以及一堆其他-W编译器标志。编译完全没有任何警告。奇怪的。 – Amit

相关问题