如何从带有分隔符的文本文件中扫描字符串然后显示它?
How to scan strings from a text file with delimiter and then display it?
所以我尝试制作一个程序,该程序将从文本文件中扫描字符串,然后使用循环显示它。但是,不知何故,我的程序无法运行,并且显示奇怪的符号。我是文本文件的新手,如果有人能向我解释我的代码有什么问题,我将不胜感激。
我的代码:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fPtr;
fPtr = fopen("alumni.txt", "r");
if (fPtr == NULL) {
printf("There is a error opening the file.");
exit(-1);
}
char name[20], design[50], category[20], location[20];
while (fscanf(fPtr, "%s:%[^\n]:%[^\n]:%[^\n]", &name, &design, &category, &location) != EOF) {
printf("Name : %s\n", name);
printf("Designation : %s\n", design);
printf("Category : %s\n", category);
printf("Location : %s\n", location);
}
}
这是我的文本文件,
Shanie:Programmer:Full Time:Kuala Lumpur
Andy:Sales Agent:Part Time:Johor Bahru
Elaine:Database Administrator Full Time Melaka
Stephanie:MIS manager:Full Time:Penang
您有 两个 问题:第一个是 %s
将读取 space 分隔的“单词” , 它不会停在 :
。第二个问题是格式 %[^\n]
读取 all until newline.
所以你需要第一个 name
的扫描集格式,并告诉它读取到下一个 :
,这是用 %[^:]
.[=32 格式完成的=]
所以请改为:
while (fscanf(fPtr, " %19[^:]:%49[^:]:%19[^:]:%19[^\n]", name, design, category, location) == 4) {
...
}
请注意我对您的调用和循环条件所做的一些其他更改:首先,我在格式中添加了长度说明符,因此 fscanf
不会超出您的数组范围。
其次,%s
和 %[]
格式都需要一个 char *
参数,而您提供了一个指向数组的指针(&name
将是 char (*)[20]
而不是 char *
)。数组自然 衰减 指向指向其第一个元素的指针,例如name
将衰减为 &name[0]
,这将是正确的类型 char *
。
第三,我将比较更改为与 4
进行比较,如果成功解析输入,fscanf
将 return 进行比较。
最后,我在第一种格式之前添加了一个 space,以跳过任何前导 space(就像上一行的换行符)。
为了确保即使在输入格式错误的情况下也能继续,我建议您改为阅读整行(使用例如 fgets
),然后可能使用 sscanf
来解析每个线.
所以我尝试制作一个程序,该程序将从文本文件中扫描字符串,然后使用循环显示它。但是,不知何故,我的程序无法运行,并且显示奇怪的符号。我是文本文件的新手,如果有人能向我解释我的代码有什么问题,我将不胜感激。
我的代码:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fPtr;
fPtr = fopen("alumni.txt", "r");
if (fPtr == NULL) {
printf("There is a error opening the file.");
exit(-1);
}
char name[20], design[50], category[20], location[20];
while (fscanf(fPtr, "%s:%[^\n]:%[^\n]:%[^\n]", &name, &design, &category, &location) != EOF) {
printf("Name : %s\n", name);
printf("Designation : %s\n", design);
printf("Category : %s\n", category);
printf("Location : %s\n", location);
}
}
这是我的文本文件,
Shanie:Programmer:Full Time:Kuala Lumpur
Andy:Sales Agent:Part Time:Johor Bahru
Elaine:Database Administrator Full Time Melaka
Stephanie:MIS manager:Full Time:Penang
您有 两个 问题:第一个是 %s
将读取 space 分隔的“单词” , 它不会停在 :
。第二个问题是格式 %[^\n]
读取 all until newline.
所以你需要第一个 name
的扫描集格式,并告诉它读取到下一个 :
,这是用 %[^:]
.[=32 格式完成的=]
所以请改为:
while (fscanf(fPtr, " %19[^:]:%49[^:]:%19[^:]:%19[^\n]", name, design, category, location) == 4) {
...
}
请注意我对您的调用和循环条件所做的一些其他更改:首先,我在格式中添加了长度说明符,因此 fscanf
不会超出您的数组范围。
其次,%s
和 %[]
格式都需要一个 char *
参数,而您提供了一个指向数组的指针(&name
将是 char (*)[20]
而不是 char *
)。数组自然 衰减 指向指向其第一个元素的指针,例如name
将衰减为 &name[0]
,这将是正确的类型 char *
。
第三,我将比较更改为与 4
进行比较,如果成功解析输入,fscanf
将 return 进行比较。
最后,我在第一种格式之前添加了一个 space,以跳过任何前导 space(就像上一行的换行符)。
为了确保即使在输入格式错误的情况下也能继续,我建议您改为阅读整行(使用例如 fgets
),然后可能使用 sscanf
来解析每个线.