C++中与fscanf()等价的函数是什么?

4

请不要说是fscanf() ;P

我试图替换掉这一行:

if ( fscanf(fp, "P%c\n", &ch) != 1 )

如果我理解正确,它尝试读取一个字符并将其存储到&ch中,只有当它在'P'和'\n'之间时才这样做。是这样吗?如果成功,它会返回1(它读取的字符数)?

我正在尝试编写C++版本。有没有简单的方法可以进行格式化读取?还是我需要使用fstream、operator>>和嵌套if语句?


2
fscanf是一个完全合法的C++函数。你对使用它有什么反对意见? - Jim Lewis
可能是 https://dev59.com/03E85IYBdhLWcg3w8IQ4 的重复问题。 - Sam Miller
如果在C++中使用fscanf()是可以的,为什么我的编译器告诉我它是不安全的? :-( - Andre
你使用的编译器是什么?我不确定,但我认为有些函数在VS编译器中被视为不安全,但我认为如果你编译一个纯C程序,同样的警告也会出现。 - Alceu Costa
我正在使用Visual Studio 2010,所以使用随附的编译器。我需要在Mac和可能的Linux系统上运行它,最好能够无警告地构建... - Andre
3
VC++认为这是不安全的,因为它依赖于null终止符的存在。它更喜欢您使用(非标准的)fscanf_s。要消除警告,您可以在调用fscanf之前的行上放置#pragma warning(suppress:4996)。非MSVC编译器不理解这个语句,但应该会忽略它,g++也会。 - Gunslinger47
2个回答

4

是的,我已经稍微看了一下,但是似乎找不到像fscanf那样格式化输入的方法("P%c\n")。我只能繁琐地这么做吗? - Andre
1
我认为你可以使用stringstream将整行读取为字符串。然后你可以在字符串中获取正确位置的字符。 - Alceu Costa

1

在Visual Studio中,安全但不可移植的等效函数是fscanf_s。

一般来说,为了可移植性,您应该使用其中一个流类,正如您所指出的,这可能很难正确格式化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接