我需要检测字符串在csv文件中的哪一行... 我试过计算' \ n'直到我们到达我们的地方... 但无论输入是什么,它总是在第二行打印。 它就像它没有真正读取文件并将文本复制到buff字符串... 并且strcpsn无法正常工作
printf("\nEnter the string you want to search: ");
getchar();
myFgets(str, LEN); //getting input
file = fopen(adr, "r"); //opening file
if (file == NULL)
{
printf("Eror opening first file\n");
return 1;
}
fseek(file, 0, SEEK_END);
len = ftell(file);
fseek(file, 0, SEEK_SET);
char* buff = (char*)calloc(strlen(str), sizeof(char));
if (buff == NULL)
{
printf("Allocation eror!\n");
return 1;
}
fread(buff, sizeof(char), len, file);
seek = strcspn(buff, str); //checking where is the string starting
while (lineSeek <= seek)
{
ch = fgetc(file);
if (ch == '\n')
{
line++;
lineSeek = ftell(file);
}
}
printf("its on %d line", line + 1);
答案 0 :(得分:0)
你可能会使它变得比它需要的更难。您可以使用strstr
搜索搜索字词时读取的每一行。在增加行数之前,您可以使用strchr
确认该行包含'\n'
(以使用fgets
防止短读。
将它们放在一起,所需要的只是以下内容。请注意,代码将搜索词作为第一个参数,然后将文件名作为第二个参数进行搜索(如果没有给出第二个参数,默认情况下它将从stdin
读取):
#include <stdio.h>
#include <string.h>
enum { MAXC = 512 };
int main (int argc, char **argv) {
if (argc < 2 ) {
fprintf (stderr, "insufficient input, usage: %s term [file (stdin)]\n",
argv[0]);
return 1;
}
size_t found = 0, line = 0;
char buf[MAXC] = "";
char *term = argv[1];
FILE *fp = argc > 2 ? fopen (argv[2], "r") : stdin;
if (!fp) {
fprintf (stderr, "error: file open failed '%s'.\n", argv[2]);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read each line */
if (strstr (buf, term)) { /* test for term */
found = 1; break; /* set found flag */
}
if (strchr (buf, '\n')) line++; /* increment line */
}
if (fp != stdin) fclose (fp);
if (found) printf ("'%s' found on line %zu.\n", term, line + 1);
return 0;
}
注意:如果您要匹配整个字段,则可以在将每个标记与搜索字词进行比较之前,使用strsep
对每一行进行标记。如果 empty-fields 不是问题,则可以使用strtok
。
示例输入
$ cat dat/search.csv
my,dog,has,fleas
the,other,one,doesn't
the,cat,has,none
the,snake,is,done
示例使用/输出
$ ./bin/searchcsv cat <dat/search.csv
'cat' found on line 3.
仔细看看,如果您有任何问题,请告诉我。