我想从.txt文件中获取字符串,读取每个都有姓名和电话号码的行。姓名和电话号码之间有两个\ t字符。
示例:
name\t\t\tphone#
thomas jefferson\t\t054-892-5882
bill clinton\t\t054-518-6974
代码是这样的;
FILE *f;
errno_t err;
treeNode *tree = NULL, temp;
char input, fileName[100];
//get file name
while (1){
printf("Enter input file name: ");
scanf_s("%s", fileName, 100);
//f = fopen(fileName, "r");
if(err = fopen_s(&f, fileName, "r"))
printf("Cannot find file!\n");
//if (f == NULL)
// printf("Cannot find file!\n");
else
break;
}
//save info into BST
fscanf_s(f, " NAME Phone #\n", 20);
while (fscanf_s(f, "%[^\t]s\t\t%[^\n]s",
temp.name, temp.phoneNo, 50, 30) != EOF)
bstInsert(tree, temp.name, temp.phoneNo);
fclose(f);
treeNode是一个二叉搜索树结构,bstInsert是一个将包含第二和第三个参数的结构添加到二叉搜索树的函数。
在我用scanf_s获取文件名后,代码在fscanf_s语句处停止,显示在调试器下面;
temp.name: invalid characters in string.
temp.phoneNo:""
我不知道[^\t]
或[^\n]
的确如何运作。任何人都可以让我知道如何处理这个问题?提前谢谢!
答案 0 :(得分:0)
“任何人都可以让我知道如何处理这个问题?”我不是scanf
和家人的粉丝,所以我通过使用不同的方法解决问题。在您使用fopen_s
和scanf_s
后,我使用了strtok
strtok_s
的“更安全”版本。
#include <stdio.h>
#include <string.h>
int main (void) {
FILE *f;
errno_t err;
char *pName, *pPhone;
char input[100], fileName[100];
char *next_token = NULL;
// get file name
do{
printf("Enter input file name: ");
scanf_s("%s", fileName, 100);
if(err = fopen_s(&f, fileName, "r"))
printf("Cannot find file!\n");
} while (err);
// read and process each line of the file
while(NULL != fgets(input, 100, f)) { // has trailing newline
// isolate name
pName = strtok_s(input, "\t\r\n", &next_token); // strip newline too
if (pName == NULL) // garbage trap
pName = "(Error)";
printf ("%-30s", pName);
// isolate phone number
pPhone = strtok_s(NULL, "\t\r\n", &next_token); // arg is NULL after initial call
if (pPhone == NULL)
pPhone = "(Error)";
printf ("%s", pPhone);
printf ("\n");
}
fclose(f);
return 0;
}
使用包含示例数据的文件编程输出:
Enter input file name: test.txt
name phone#
thomas jefferson 054-892-5882
bill clinton 054-518-6974