Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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
如何使用strcmp比较csv数据中的名称_C_Csv_Strcmp - Fatal编程技术网

如何使用strcmp比较csv数据中的名称

如何使用strcmp比较csv数据中的名称,c,csv,strcmp,C,Csv,Strcmp,我想打开一个csv文件并比较第一行的内容。 我已经编写了打开文件的代码,我只是不知道如何将第一行与打开文件中的strcmp进行比较 打开文件 #include <stdio.h> #include <stdlib.h> int main(void) { setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); FILE *f;

我想打开一个csv文件并比较第一行的内容。 我已经编写了打开文件的代码,我只是不知道如何将第一行与打开文件中的strcmp进行比较

打开文件

#include <stdio.h>
#include <stdlib.h>

   int main(void) {
         setvbuf(stdout, NULL, _IONBF, 0);
         setvbuf(stderr, NULL, _IONBF, 0);

          FILE *f;
          char file_name[255];
          char data[127];

          printf("Which file you want to open : ");
          scanf("%s",file_name);

          f = fopen("C:\\projekt\\datei.csv","r");
          if(f == NULL){
              printf("Could not open %s\n" ,file_name);
              exit(0);
          }

while( fgets(data, sizeof(data), f) != 0 )
    fputs(data, stdout);

    return 0;
}

档案里有什么

"Date"  "Time"  "Volt"  "Amp"   "Wirkfaktor"
26.10.13    08:00:00    237.802 1160.7682   0.7461853792
26.10.13    08:00:01    237.658 1168.92273  0.7203561543
26.10.13    08:00:02    237.815 1158.57273  0.7344799394
26.10.13    08:00:03    237.566 1174.5682   0.6960312563
26.10.13    08:00:04    238.063 1151.67273  0.80126914



  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>


 int main(void) {
 setvbuf(stdout, NULL, _IONBF, 0);
 setvbuf(stderr, NULL, _IONBF, 0);

FILE *f;
char file_name[255];
char data[127];

printf("Which file you want to open : ");
scanf("%s",file_name);

f = fopen("C:\\projekt\\datei.csv","r");
if(f == NULL){
    printf("Could not open %s\n" ,file_name);
    exit(0);
}

 while( fgets(data, sizeof(data), f) != NULL ){
      //fputs(data, stdout);

}

int good = 1;
int i;

char heading[5][20];
if ( sscanf( data, "%19s%19s%19s%19s%19s", heading[0], heading[1], heading[2], heading[3], heading[4] ) != 5 )
{
    good = 0;
}

if ( good )
{

    char *expected[5] = { "\"Date\"t\"Time\"t\"Volt\"t\"Amp\"t\"Wirkfaktor\"" };
    for ( i = 0; i < 5; i++ )
        if ( strcmp( expected[i], heading[i] ) != 0 )
            good = 0;
}

if ( !good )
{
    printf( "Heading line is incorrect\n" );
    exit( 0 );
}


 return 0;


}   

要验证文件的第一行是否正确,请首先使用sscanf提取五个字符串,然后使用strcmp将这些字符串与预期的字符串进行比较

如果您只是想看看它是否包含这5个字符串,也许考虑使用Strutok将第一行拆分为令牌,然后使用STRCMP将这些令牌与希望包含的字符串进行比较。下面列出了此操作的代码。 如果试图获取该特定字符串,则要比较第一行的字符串将是\Date\\t\Time\\t\Volt\\t\Amp\\t\Wirkfaktor\假定第一行是以制表符分隔的。 注意:在新的代码中,我将自动声明从主军团中移除,这是因为我的vc6编译器在主声明中对此感到耻辱。
我用你的想象力写了一个简短的解决方案。这并不重要,您当然可以抵抗strcmp或strncmp的使用,因为strcmp和formating属性是同一个函数。待会儿见。

fgetsdata,sizeofdata,f!=0->fgetsdata,sizeofdata,f!=Null谢谢,尽管它也适用于0,但您希望将文件的第一行与之进行什么样的比较?你说的第一行是什么意思?标题行还是第一个数据行?比较的结果应该是什么?是的,因为在您的情况下NULL被定义为0或void*0,但您不能在所有实现中都依赖于此,为什么在请求路径后要打开一个固定路径?@Alter Mann Code可以在所有实现中依赖于此。所有空指针(包括空指针、比较指针)均等于0。关于第二点:请小心。我猜该文件是用制表符分隔的,因为它是一个csv文件,但不包含逗号。因此,需要对:\Date\\t\Time\\t\Volt\\t\Amp\\t\Wirkfaktor\进行比较。谢谢,我添加了一个更新以反映制表符分隔的字符串OK,也许您还应该添加一个,您现在假设使用制表符分隔的文件。顺便问一下,你确定你的代码是正确的吗?第三行中缺少一个},我认为您必须多次调用strtok,直到处理完所有令牌。现在,您似乎只比较文件的第一个字符串日期和检查数组。由于结果在循环中没有改变,它似乎是一个无限循环…啊,谢谢你再次救了我。添加了缺少的结束括号,并在while中链接了更新的strtok,它修复了无限循环并比较了其余的循环。如果您查看关于该问题的注释,您将看到OP讨论的是文件中的标题行,而不是第一行数据。请阅读BryanS回答下面的注释。这两行很可能包含制表符,因此您建议的比较不起作用。发送给用户3386109。是的,不,真的好好看看,但是你为什么不想让它不起作用呢?请请尝试运行正确的代码。。。谢谢Tab只是scanf的一个可能的分隔符
int good = 1;

char heading[5][20];
if ( sscanf( data, "%19s%19s%19s%19s%19s", heading[0], heading[1], heading[2], heading[3], heading[4] ) != 5 )
    good = 0;

if ( good )
{
    char *expected[5] = { "\"Date\"", "\"Time\"", "\"Volt\"", "\"Amp\"", "\"Wirkfaktor\"" };
    for ( i = 0; i < 5; i++ )
        if ( strcmp( expected[i], heading[i] ) != 0 )
            good = 0;
}

if ( !good )
{
    printf( "Heading line is incorrect\n" );
    exit( 1 );
}
char* result = NULL;
char delims[] = {'"', ' '}; // split on spaces and double quotes
char check[] = {"Date","Time","Volt","Amp","Wirkfaktor"};
result = (char*)strtok( data, delims );
int i = 0;
while(result != NULL) {
    if(strcmp(result,check[i]) {
        printf("File Invalid\n");
        exit(0);
    }
    result = (char*)strtok( NULL, delims);
    i++;
}
// If we get here than the file was good.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


FILE *f;
char file_name[255];
char data[127];

char dataRef[]="26.10.13    08:00:00    237.802 1160.7682   0.7461853792";

main() 
{
    setvbuf(stdout, NULL, _IONBF, 0);
    setvbuf(stderr, NULL, _IONBF, 0);



    f = fopen("datei.csv","r");
    if(f == NULL){
        printf("Could not open %s\n" ,file_name);
        exit(0);
    }

    while( fgets(data, sizeof(data), f) != 0 )
    {
    fputs(data, stdout);
    if (strncmp(dataRef,data,56)==0)
    {
    printf(" Here's the tip's between the file chain and the stack reference chain ....");
    fputs(data, stdout);
    fputs(dataRef, stdout);
    printf("\n");
    }}}