Mysql 读到行尾
我有一个文件,有超过6000行的错误数据Mysql 读到行尾,mysql,c,parsing,scanf,Mysql,C,Parsing,Scanf,我有一个文件,有超过6000行的错误数据 P000800发动机位置系统性能 P000900发动机位置系统性能 P001000“A”凸轮轴位置执行器电路 P001100“A”凸轮轴位置-正时过高或系统性能 P001200“A”凸轮轴位置-正时过度延迟 第一个字符串总是在左边,然后是空格和描述 就我的一生而言,我似乎不记得如何让它阅读描述,直到 下线 我将把它放到另一个文件中,类似于MySQL导入的文件 P000800,发动机位置系统性能 P000900,发动机位置系统性能 P001000,“A”
P000800发动机位置系统性能
P000900发动机位置系统性能
P001000“A”凸轮轴位置执行器电路
P001100“A”凸轮轴位置-正时过高或系统性能
P001200“A”凸轮轴位置-正时过度延迟
第一个字符串总是在左边,然后是空格和描述
就我的一生而言,我似乎不记得如何让它阅读描述,直到
下线
我将把它放到另一个文件中,类似于MySQL导入的文件
P000800,发动机位置系统性能
P000900,发动机位置系统性能
P001000,“A”凸轮轴位置执行器电路
P001100,“A”凸轮轴位置-正时过高或系统性能
P001200,“A”凸轮轴位置-正时过度延迟
除非您知道一种更简单的方法使其与MySQL数据库兼容
while ( (fgets(line, sizeof(line), fp_code) != NULL) && (line[0] != '\n') ){
sscanf(line,"%s %s",ercode, desc);
}
谢谢
Bob您是如何声明
行的:它是类似于char*line
还是char-line[100]
?这很重要,因为获取其大小的方式是使用sizeof
运算符。对于第一个选项,sizeof
将给出指针的大小,而对于第二个选项,它将给出指针的实际大小,即100
此外,您对换行符的检查应该是最后一个字符,行[strlen(line)-1]
,而不是第一个字符,行[0]
另一件事,您不能依靠fgets
获取行中的所有字符,因为您受到sizeof(line)
的限制。一种解决方案是迭代直到得到换行符,然后将字符串作为一个整体进行处理。我所看到的实际实现,虽然不是很优雅,但很有效,就是让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
返回扫描的字数,以便它可以用作循环计数器,将它们处理为另一种字符串格式。这里有一个版本,它应该适用于几乎与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;
}
#包括
#包括
int main(int argc,字符**argv)
{
字符标记[10];
残炭[BUFSIZ];
文件*in=fopen(argv[1],“r”);
if(in==NULL)
{
返回退出失败;
}
//格式说明:
//%9在字符串中最多读取9个字符
//%[^\n]读取所有字符,直到“\n”变成字符串
//%*c读取字符但不存储它。处理
//正在从输入流中删除“\n”。
while(fscanf(在“%9s%[^\n]%*c”中,令牌,rest)==2)
{
printf(“%s,%s\n”,令牌,剩余);
}
fclose(in);
返回退出成功;
}
你为什么这样写你的子程序?哦,好的。这很有意义现在我在发布这个答案时去掉了函数参数中的下栏,因为它们使地平线滚动条出现,但保留了完整的函数名:)尽管这确实提出了一个问题,为什么你要这样写你的函数名?(很高兴听到你不再喜欢了。)@WhozCraig我很高兴听到你很高兴。不管怎样,这不是我20多年来的编码风格代码>我声明它是字符行[256];chux&R Sahu这些非常有效。他们不允许我对你的答复投赞成票。