伙计们,我有这部分代码:
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++文档,但同样适用于 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...
}
}
关于c - 解析txt文件C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44130428/