首页 > 解决方案 > 用C中的空格逐字读取文件

问题描述

文件中的input数据text如下:

Mike     107        Europe             6798  
Steve    023        New York           2588
Adam     057        South Town         1902
Adam     124        Asia               5555

数据以whitespace

C code从文件中读取数据是:

char name[30];
int code;
char local[30];
int id;


while (fscanf(fp, "%s %d %[^ ] %d", name, &code, local, &id) != EOF){

    printf("%s-%d-%s-%d\n", name, code, local, id);
}

local我的代码的问题是,我的打印输出总是一次读取一个单词:

Mike     107        Europe             6798  
Steve    023        New                2588
Adam     057        South              1902
Adam     124        Asia               5555

New York并被South Town截断。我该如何解决?

标签: cfile

解决方案


您的数据似乎需要两种方式 - 使用空间作为分隔符和内容。这充其量只是一个模棱两可的设计决策,而 CSV 可能是一个更好的解决方案。但是,您可以对至少在示例输入中解决问题的数据内容进行大概的假设。

假设该local列不能包含数字字符,则:

fscanf(fp, "%s %d %[^0123456789\t] %d", name, &code, local, &id)

我已经包括\t(TAB)以确保不会出错。然而,这样做的效果是local包含所有尾随空格。你可以这样修剪它们:

for( int i = strlen(local) - 1; local[i] == ' '; i-- )
{
    local[i] = 0 ;
}

或者,您可以阅读整行并对其进行处理,以使单个空格不是分隔符,而 >1 个空格或 TAB 是。或者,如果您可以保证没有 TAB,您可以按列号提取字段数据,但这一切都变得相当繁琐:

    while( fgets( line, sizeof(line), fp ) != NULL )
    {
        line[NAME_COL-1] = 0 ;
        line[CODE_COL-1] = 0 ;
        line[ID_COL-1] = 0 ;
        sscanf(&s[NAME_COL], "%s", name) ;
        sscanf(&s[CODE_COL], "%d", &code) ;
        sscanf(&s[LOCAL_COL], "%s", local) ;
        sscanf(&s[ID_COL], "%d", &id) ;
        for( int i = strlen(local) - 1; local[i] == ' '; i-- )
        {
            local[i] = 0 ;
        }
        printf("%s-%d-%s-%d\n", name, code, local, id);
    }

推荐阅读