我的文件有超过6,000行错误数据。
P000800 Engine Position System Performance
P000900 Engine Position System Performance
P001000 "A" Camshaft Position Actuator Circuit
P001100 "A" Camshaft Position - Timing Over-Advanced or System Performance
P001200 "A" Camshaft Position - Timing Over-Retarded
第一个字符串始终位于左侧,然后是空格和描述。
对于我的生活,我似乎无法记住如何阅读说明直到 行尾。
我把它放到另一个看起来像这样的MySQL导入文件
P000800,Engine Position System Performance
P000900,Engine Position System Performance
P001000,"A" Camshaft Position Actuator Circuit
P001100,"A" Camshaft Position - Timing Over-Advanced or System Performance
P001200,"A" Camshaft Position - Timing Over-Retarded
除非您知道一种更简单的方法使其与MySQL数据库兼容。
while ( (fgets(line, sizeof(line), fp_code) != NULL) && (line[0] != '\n') ){
sscanf(line,"%s %s",ercode, desc);
}
由于 鲍勃
答案 0 :(得分:0)
您是如何声明line
的:是char *line
还是char line[100]
?这很重要,因为你获得它的大小的方式是使用sizeof
运算符。对于第一个,sizeof
将为您提供指针的大小,而对于第二个,它将为您提供100的实际大小。
此外,您对换行符的检查应该是最后一个字符line[strlen(line) - 1]
,而不是第一个字符line[0]
。
另一方面,您不能依赖fgets
获取该行中的所有字符,因为您受sizeof(line)
的限制。一种解决方案是迭代直到获得换行符,然后整体处理该字符串。
答案 1 :(得分:0)
我见过的实际实现,不是那么优雅但有效,是让sscanf
扫描一定数量的%s
,如下所示:
// scans up to 50 words in a line
int Read_Words_From_String(char *StringLine, char **StringArray)
{
return(sscanf(StringLine, "%s%s..//which goes on to the count of 50..%s%s",
StringArray[0], // would contain ercode in your case
StringArray[1],
: // which goes on to the count of 50
StringArray[49]));
}
sscanf
返回扫描的字数,以便它可以用作循环计数器,将它们处理成另一种字符串格式。
答案 2 :(得分:0)
这是一个适用于几乎与BUFSIZ
一样长的行的版本。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char token[10];
char rest[BUFSIZ];
FILE* in = fopen(argv[1], "r");
if ( in == NULL )
{
return EXIT_FAILURE;
}
// Explanation of the format:
// %9s Read at most 9 characters into a string
// %[^\n] Read all characters until '\n' into a string
// %*c Read a character but don't store it. Takes care of
// getting rid of the `\n' from the input stream.
while ( fscanf(in, "%9s %[^\n]%*c", token, rest) == 2 )
{
printf("%s,%s\n", token, rest);
}
fclose(in);
return EXIT_SUCCESS;
}