读取文件:fscanf 不读取空格?
Read File: fscanf doesn't read whitespaces?
我在使用 fscanf 从文件指针中获取行时遇到问题。
假设要获取这样的一行:
<123324><sport><DESCfddR><spor ds>
Fscanf 只获取这部分:
<123324><sport><DESCfddR><spor
有人知道如何解决这个问题吗?
提前致谢。
总之,读取包含空格的行的最佳方法是使用 fgets:
fgets (currentLine, MAX_LENGTH , filePointer);
使用 fscanf 你会遇到很多问题。
您可能正在 fscanf
中使用 %s
来读取数据。从 C11 标准,
7.21.6.2 The fscanf function
[...]
- The conversion specifiers and their meanings are:
[...]
s Matches a sequence of non-white-space characters. 286
[...]
因此,%s
将在遇到白色space 字符时停止扫描,或者,如果长度字段存在,直到指定的长度或直到白色space 字符,以先到者为准。
如何解决这个问题?使用不同的格式说明符:
fscanf(fp ," %[^\n]", buffer);
上面的fscanf
跳过所有白色space字符,如果有的话,直到第一个非白色space字符(space开始),然后, %[^\n]
扫描所有内容,直到出现 \n
个字符。
您可以使用
进一步提高安全性
fscanf(fp ," %M[^\n]", buffer);
将M
替换为buffer
减一的大小(为NUL终止符保留一个space)。它是长度修饰符。另外检查 fscanf
的 return 值是个好主意。
不过使用 fgets()
是更好的方法。
我在使用 fscanf 从文件指针中获取行时遇到问题。
假设要获取这样的一行:
<123324><sport><DESCfddR><spor ds>
Fscanf 只获取这部分:
<123324><sport><DESCfddR><spor
有人知道如何解决这个问题吗?
提前致谢。
总之,读取包含空格的行的最佳方法是使用 fgets:
fgets (currentLine, MAX_LENGTH , filePointer);
使用 fscanf 你会遇到很多问题。
您可能正在 fscanf
中使用 %s
来读取数据。从 C11 标准,
7.21.6.2 The fscanf function
[...]
- The conversion specifiers and their meanings are:
[...]
s Matches a sequence of non-white-space characters. 286
[...]
因此,%s
将在遇到白色space 字符时停止扫描,或者,如果长度字段存在,直到指定的长度或直到白色space 字符,以先到者为准。
如何解决这个问题?使用不同的格式说明符:
fscanf(fp ," %[^\n]", buffer);
上面的fscanf
跳过所有白色space字符,如果有的话,直到第一个非白色space字符(space开始),然后, %[^\n]
扫描所有内容,直到出现 \n
个字符。
您可以使用
进一步提高安全性fscanf(fp ," %M[^\n]", buffer);
将M
替换为buffer
减一的大小(为NUL终止符保留一个space)。它是长度修饰符。另外检查 fscanf
的 return 值是个好主意。
不过使用 fgets()
是更好的方法。