我正在使用此代码来解析C语言中的.csv文件。
如果字段采用这种格式,则可以使用
ENTRY1,ENTRY2,ENTRY3,ENTRY4
或即使这里有逗号:
ENTRY1, ENTRY2, ENTRY3, ENTRY4
但是,如果在输入之后但在逗号之前有空格,则程序将崩溃。像这样:ENTRY1 ,ENTRY2,ENTRY3,ENTRY4
代码:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *input_fp =fopen("file", "r");
char buf[100];
while (fgets(buf, sizeof buf, input_fp) != NULL) {
char field1[30], field2[30], field3[30], field4[30];
#define VFMT " %29[^ ,\n\t]" //Defines limit of one entry to be 30 characters
int n; // Use to check for trailing junk
if (4 == sscanf(buf, VFMT "," VFMT "," VFMT "," VFMT " %n", field1, field2,
field3, field4, &n) && buf[n] == '\0') {
// Suspect OP really wants this wfield1th to be 1 more
if (printf("%s %s %s %s\n", field1, field2, field3, field4) < 0)
break;
} else
break; // format error
}
fclose(input_fp);
return 0;
}
示例运行: 文件包含:
ENTRY1, ENTRY2, ENTRY3, ENTRY4
ENTRY5,ENTRY6,ENTRY7,ENTRY8
ENTRY5 , ENTRY6, ENTRY7, ENTRY8
ENTRY1, ENTRY2, ENTRY3, ENTRY4
输出为:
ENTRY1 ENTRY2 ENTRY3 ENTRY4
ENTRY5 ENTRY6 ENTRY7 ENTRY8
它在结束第三行之前停止并退出。
答案 0 :(得分:0)
按照您的示例和预期的输出,我更喜欢使用fgetc
来处理输入字符。
这将使我们能够解析和拒绝不需要的字符,从而避免了存储数据的开销-如fgets
中那样,然后解析存储的数据。
结果(fputc
)也可以定向到文件...
代码看起来像这样.....希望对您有帮助...
#include <stdio.h>
int main()
{
FILE *input_fp =fopen("file", "r");
int c;
while ((c=fgetc(input_fp)) != EOF)
{
if(c == ' ' || c == '\t')//if space or tab
; //do nothing
else
fputc(c,stdout); //print c
}
fclose(input_fp);
return 0;
}