如何使用strcmp比较csv数据中的名称
我想打开一个csv文件并比较第一行的内容。 我已经编写了打开文件的代码,我只是不知道如何将第一行与打开文件中的strcmp进行比较 打开文件如何使用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;
#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");
}}}