阅读直至行尾

时间:2014-06-13 00:19:09

标签: mysql c parsing scanf

我的文件有超过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);
}

由于 鲍勃

3 个答案:

答案 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;
}