使用 fscanf 从文件中读取字符串后读取整数
Read integer after reading a string from a file using fscanf
我制作了一个程序,其中 test.txt 文件包含以下内容
24 Rohit Soni 1997
这是我的代码:
#include <stdio.h>
void main()
{
FILE *f;
int no,i;
char *name;
f=fopen("test.txt","r");
fscanf(f,"%d %[^[0-9]]s %d ",&no, name, &i);
printf("%d %s %d",no, name,i);
fclose(f);
}
但它没有显示正确的输出。
输出为:
24 Rohit Soni 12804
请告诉我该怎么做。为什么在使用 %[
格式说明符从 fscanf
中获取字符串后不接受整数。
您应该测试 fscanf()
中的 return 代码;它会告诉您转换了 2 个值,而不是您期望的 3 个值。您应该始终测试 fscanf()
中的 return 代码,通常是针对预期的转换次数,很少会测试 EOF 或 0。
问题是扫描集 %[^…]
不是 %s
的修饰符,并且扫描集在第一个 ]
处停止,除非它紧跟在 [=17] 之后=] 用于常规扫描集或 [^
用于否定扫描集。因此,您的格式字符串正在寻找一系列 'not a digit nor an [
' 字符,后跟 ]
和 s
— 但它没有找到 ]
和 s
在输入中。
你需要:
#include <stdio.h>
int main(void)
{
const char *filename = "test.txt";
FILE *f = fopen(filename, "r");
if (f == 0)
{
fprintf(stderr, "Failed to open '%s' for reading\n", filename);
return 1;
}
int no,i;
char name[128];
if (fscanf(f, "%d %127[^0-9] %d", &no, name, &i) != 3)
{
fprintf(stderr, "Failed to read three values\n");
return 1;
}
printf("%d [%s] %d\n", no, name, i);
fclose(f);
return 0;
}
您需要检查 fopen()
是否有效。错误消息应包括您无法打开的文件名。 (如果您注意命令行参数 - 使用 int main(int argc, char **argv)
- 您也会在错误消息中报告来自 argv[0]
的程序名称。)您需要为 [=27= 分配 space ] 而不是使用未初始化的指针。 correct return type for main()
is int
— though Microsoft does allow void
. Note that the input format ensures there is no buffer overflow.
我在输出中将名称包含在 […]
中,因此您可以看到该名称包含结尾的 space。我得到的输出是:
24 [Rohit Soni ] 1997
我制作了一个程序,其中 test.txt 文件包含以下内容
24 Rohit Soni 1997
这是我的代码:
#include <stdio.h>
void main()
{
FILE *f;
int no,i;
char *name;
f=fopen("test.txt","r");
fscanf(f,"%d %[^[0-9]]s %d ",&no, name, &i);
printf("%d %s %d",no, name,i);
fclose(f);
}
但它没有显示正确的输出。 输出为:
24 Rohit Soni 12804
请告诉我该怎么做。为什么在使用 %[
格式说明符从 fscanf
中获取字符串后不接受整数。
您应该测试 fscanf()
中的 return 代码;它会告诉您转换了 2 个值,而不是您期望的 3 个值。您应该始终测试 fscanf()
中的 return 代码,通常是针对预期的转换次数,很少会测试 EOF 或 0。
问题是扫描集 %[^…]
不是 %s
的修饰符,并且扫描集在第一个 ]
处停止,除非它紧跟在 [=17] 之后=] 用于常规扫描集或 [^
用于否定扫描集。因此,您的格式字符串正在寻找一系列 'not a digit nor an [
' 字符,后跟 ]
和 s
— 但它没有找到 ]
和 s
在输入中。
你需要:
#include <stdio.h>
int main(void)
{
const char *filename = "test.txt";
FILE *f = fopen(filename, "r");
if (f == 0)
{
fprintf(stderr, "Failed to open '%s' for reading\n", filename);
return 1;
}
int no,i;
char name[128];
if (fscanf(f, "%d %127[^0-9] %d", &no, name, &i) != 3)
{
fprintf(stderr, "Failed to read three values\n");
return 1;
}
printf("%d [%s] %d\n", no, name, i);
fclose(f);
return 0;
}
您需要检查 fopen()
是否有效。错误消息应包括您无法打开的文件名。 (如果您注意命令行参数 - 使用 int main(int argc, char **argv)
- 您也会在错误消息中报告来自 argv[0]
的程序名称。)您需要为 [=27= 分配 space ] 而不是使用未初始化的指针。 correct return type for main()
is int
— though Microsoft does allow void
. Note that the input format ensures there is no buffer overflow.
我在输出中将名称包含在 […]
中,因此您可以看到该名称包含结尾的 space。我得到的输出是:
24 [Rohit Soni ] 1997