解析文件txt C

地雷

伙计们,我有这部分代码:

void token(){
FILE *pointer;
user record;
pointer = fopen("utente_da_file.txt","r+");
printf("OK");   
fscanf(pointer , "%s, %s, %s, %s, %s \n" , record.nome_utente , record.nome , record.cognome , record.data_di_nascita , record.data_di_iscrizione);
fclose(pointer);
printf("TEXT -> %s \n" , record.nome_utente);
}

这是 utente_da_file.txt

cocco,ananas,banana,ciao,miao 

这是我的输出:

TEXT -> cocco,ananas,banana,ciao,miao 

我不明白为什么。问候 :)

阿空加瓜

这是由于 scanf 系列中 %s 参数的性质:它消耗所有字符直到它遇到的第一个空格字符 – 或直到输入结束,以先到者为准(scanf - OK,C++ 文档,但适用于一样)。由于您的文件中没有任何空格,因此在您可以在格式字符串中扫描它们之前,会立即消耗整个内容,包括逗号...

如果您检查 (f)scanf 的返回值,您会得到一个提示 - 它返回填充的变量数,因此您应该得到 1 作为返回值。

(f)scanf 系列的问题在于您无法指定要停止的字符串的分隔符。因此,在您的情况下,您必须在文件的单词之间附加空格。但请注意,逗号将成为字符串的一部分,然后,如果您它们之后附加空格,则必须在之前附加空格以便您的格式字符串可以使用它们 - 不过,这可能会使您的文件变得丑陋,所以您可能更喜欢然后完全删除它(但也将它们放入格式字符串中!)。

或者,您可以使用fgets一次读取整行,然后使用strtok解析它整个过程可能类似于以下代码:

char buffer[256];
fgets(buffer, sizeof(buffer), pointer);
char const* delimiters = ", \t\n\r";
char* token = strtok(buffer, delimiters);
if(token)
{
    strncpy(record.nome_utente, token, sizeof(record.nome_utente));
    if((token = strtok(NULL, delimiters)))
    {
        strncpy(record.nome, token, sizeof(record.nome));
        // rest alike...
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章