c - 用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
截断。我该如何解决?
解决方案
您的数据似乎需要两种方式 - 使用空间作为分隔符和内容。这充其量只是一个模棱两可的设计决策,而 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);
}
推荐阅读
- c# - 如何查看列表中最常见的值?
- c++ - 如何从枚举类值中指定模板函数参数中的数组大小?
- python - 绘图和破折号:“响应”类型的对象不是 JSON 可序列化的
- cordova - 我们无法看到谷歌分析收集的任何指标。没有错误,但没有收集指标
- html - 我正在尝试所有选定的数组来更改样式 Angular 4
- php - 根据标签删除 HTML 标记并删除其间的所有内容
- r - 如何删除 R 数据框中条件行的以下行?
- jdeveloper - JDeveloper 阻止创建和编辑文件
- android - cardview中的MPAndroidChart饼图画得很小
- d3.js - d3 点击事件停止缩放和平移图层