1

我想.csv逐行读取文件,然后检查我的行的第一个单词是否匹配string_1。如果匹配,那么我还想检查第二个单词是否匹配string_2。我的.csv文件包含三个字段,即用户、密码和类型。到目前为止,这是我的代码:

void verify ( char *user, char *password ) {

    FILE *data;
    char verifyUser[50];

    data = fopen( "password.csv", "r+" );
    while ( fgets(verifyUser, 50, data ) != NULL) {

        char *ptr;
        ptr = strtok(verifyUser, ", ");

        /***What do I do here?***/
    }

    fclose(data);
}

在这种情况下,user和分别passwordstring_1string_2。有小费吗?我可以使用strtok将我的行分成三个子字符串,然后strcmp对它们执行吗?如果是这样,我该怎么做?

4

4 回答 4

1

沿着这些思路怎么样:

ptr = strtok(verifyUser, ", ");
if (!ptr || strcmp(ptr, user))
    continue;

/* Okay, so the user matches. */
char *pass = strtok(NULL, ", ");
if (!pass || strcmp(pass, password)) {
    /* Invalid. */
    break;
}

当然,此代码假定您已经信任这些字符串userpassword并且它也未经测试。

于 2012-11-18T20:06:55.323 回答
1

我不想听起来很迂腐,但是当你打开一个文件时,你应该添加一个if来测试文件是否可以打开。就像是:

if ( ( data = fopen( "password.csv", "r+" ) ) != NULL ){
    printf( "The file couldn't be opened" );
}
else{
   .
   .
   .
}

或者,如果无法打开文件来跟踪问题,至少要注意一些事情。

于 2012-11-18T20:18:08.997 回答
1

您遇到的最大问题是strtok(verifyUser, ", ")将输入行拆分为逗号和空格,因此如果您的任何字段包含空格(例如真实姓名),它们将被拆分为多个字段。

通常的使用方式strtok是循环使用:

for (token = strtok(inputLine, ","); token; token = strtok(0, ",")) {
    /* do something with token */
于 2012-11-18T20:35:53.293 回答
0

首先,您不是逐行阅读它。您正在复制 50 个字符,verifyUser
因此它的工作时间不会超过缓冲区大小(50)长度。fgets(验证用户,50,数据)

readline 使用这样的东西......

getline(data, yourVariable, '\n');

然后你可以做的是..

ptr = strtok(yourVariable, ", ");
// now u have to iterate through `ptr` to get all the sub-strings(split-ed using parameter ',')
while(ptr !=NULL){
     if(strcmp(ptr, user)){
         // do stuff here like `break;` etc
     }
}

顺便说一句,如果你进行错误检查,这是一个很好的做法......比如假设fopen()失败(那么你不应该运行其余代码......)

于 2012-11-18T20:21:28.237 回答