c - 解析txt文件C

标签 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++文档,但同样适用于 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/

相关文章:

c - 为什么在尝试 "cat"我的字符设备驱动程序时收到错误消息?

c - 这个 fork() 代码如何创建五个进程?

c - 如何让程序在源代码管理中显示正确的版本号?

c - 缺少头文件时链接到 BLAS

c - 如何正确地将元素存储在 C 的 char 数组中?

c++ - C/C++ 计时器,如瑞士 watch

c++ - 在 Linux 中从我的应用程序启动网页

c - 删除 ascii float 中的小数点而不截断或精度损失

c - 尽管设置了 rfcomm 安全性,Bluez hcidump 仍然清晰

C linux pthread需要 sleep 才能工作