Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 读到行尾_Mysql_C_Parsing_Scanf - Fatal编程技术网

Mysql 读到行尾

Mysql 读到行尾,mysql,c,parsing,scanf,Mysql,C,Parsing,Scanf,我有一个文件,有超过6000行的错误数据 P000800发动机位置系统性能 P000900发动机位置系统性能 P001000“A”凸轮轴位置执行器电路 P001100“A”凸轮轴位置-正时过高或系统性能 P001200“A”凸轮轴位置-正时过度延迟 第一个字符串总是在左边,然后是空格和描述 就我的一生而言,我似乎不记得如何让它阅读描述,直到 下线 我将把它放到另一个文件中,类似于MySQL导入的文件 P000800,发动机位置系统性能 P000900,发动机位置系统性能 P001000,“A”

我有一个文件,有超过6000行的错误数据

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这些非常有效。他们不允许我对你的答复投赞成票。