伙计们,我有这部分代码:
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] 删除。
我来说两句