我有一个文件需要从某些变量中读取。信息以分隔符存储在文件中;将每一点信息分开。例如:
308163583; Adam; Fro; 22; M; mogar; mmMM8675;喜欢在沙滩上散步; 1,2,3,4;
之后我将把这些信息放入一个结构中,但现在不相关了。问题是它扫描一切都很好,直到“喜欢在海滩上行走”,它停在“喜欢”,只扫描这个词到描述字符串
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXID 10
#define MAXN 11
#define MAXPAS 7
#define MAXDES 201
#define MAXHOB 4
#define MAXGEN 2
typedef enum { false, true } bool;
typedef struct {
char* id;
char* fname;
char* lname;
int age;
char* gender;
char* username;
char* password;
char* description;
int hobbies;
}User;
typedef struct {
User *users;
int num_users;
}List;
void inputFunction(FILE *ifp);
void main() {
FILE *ifp;
char mode[] = "r";
ifp = fopen("input.txt", mode);
if (ifp == NULL) {
puts("Can't open input file");
exit(1);
}
inputFunction(ifp);
}
void inputFunction(FILE *ifp) {
List userList;
userList.users = (User*)malloc(1 * sizeof(User));
int i = 0;
char id[MAXID], fname[MAXN], lname[MAXN], gender[MAXGEN],
username[MAXN], password[MAXPAS], description[MAXDES];
int age, hobbies[MAXHOB];
while (fscanf(ifp, "%s ;%s ;%s ;%d;%s ;%s ;%s ;%s;%d,%d,%d,%d", id,
fname, lname, &age, gender, username, password, description,
&hobbies[0], &hobbies[1], &hobbies[2], &hobbies[3])!=EOF)
{
}
}
答案 0 :(得分:7)
这是因为scanf的%s
被指定为匹配一系列非空白字符。您希望它扫描一系列非分号字符。作为练习留下:-)提示:阅读手册并查看%[...]
说明符的工作原理。
另请注意
while (fscanf(...) != EOF)
是一个巨大的错误,因为fscanf返回成功转换项目的数量,即如果没有转换则为0,如果所有项目都已转换,则为12。测试EOF您无法检测是否正确转换的项目少于12个。你应该认真考虑从上到下阅读scanf/fscanf manual from。这非常有启发性,并将在整个编程生涯中一次又一次地证明是有价值的。
答案 1 :(得分:4)
您可以使用strtok
函数使用您自己的分隔符分割行。
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
const char delims[] = ";"; //List of delimiters
char str[] = "308163583 ;Adam ;Fro ;22;M ;mogar ;mmMM8675 ;like to walk on the beach ;1,2,3,4;";
char * pch;
// Split the string at specified set of delimters
pch = strtok (str,delims);
while (pch != NULL)
{
// Do whatever you need to process the token here
printf ("%s\n",pch);
// Find the next token
pch = strtok (NULL,delims);
}
return 0;
}
答案 2 :(得分:0)
@Jens:对于当前的作业,我不需要检查所有字段是否正确,给出了它。 找到了不同的解决方案:
List loadFile(FILE *ifp) {
int i = 0;
List userList;
userList.users = NULL;
char id[MAXID], fname[MAXN], lname[MAXN], gender[MAXGEN], username[MAXN], password[MAXDES], description[MAXDES];
int age, hobbies[MAXHOB];
while (fscanf(ifp, "%s ;%s ;%s ;%d;%s ;%s ;%s ;%200[^;];%d,%d,%d,%d;\n", id, fname, lname, &age, gender, username, password, description, &hobbies[0], &hobbies[1], &hobbies[2], &hobbies[3]) != EOF)
{