如何打印当前行?

时间:2015-04-12 12:13:29

标签: c string search

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

int main()

{
    int i, f=0;
    int c;
    char file_name[100];
    char  search[10];

    printf("Enter the file name:");
    scanf("%s", file_name);
    printf("Search word:");
    scanf("%s", search);

    FILE *f = fopen((strcat(file_name, ".txt")), "rb");
    fseek(f, 0, SEEK_END);
    long pos = ftell(f); 
    fseek(f, 0, SEEK_SET);

    char *bytes = malloc(pos);
    fread(bytes, pos, 1, f);
    fclose(f);

/*search*/

    if (strstr(bytes, search) != NULL){
      printf("found\n");
       f = 1;}
      else{
    printf("Not found\n");

    f=0;}

    if (f==1){    /* if found...print the whole line */
     ....}
  free(bytes);

}

上面说的是我从.txt文件中搜索字符串的程序。找到后,它会打印&#34;找到&#34;,否则打印&#34;未找到&#34;。现在我想要打印字符串是其中一部分的完整行。我在考虑使用&f; = = 1&#39;作为&#39;如果找到&#39;的条件打印整行,不确定什么是最好的方法。

1 个答案:

答案 0 :(得分:0)

首先,您需要修复您的读取,以便从NUL终止的文件中保留您读取的数据:

char *bytes = malloc(pos + 1);
fread(bytes, pos, 1, f);
bytes[ pos ] = '\0';

添加一些错误检查 - 检查malloc()fread()的回复。这是一个很好的习惯。

然后,如果您找到了您的字符串,请将您在此处阅读的内容拆分:

char *found = strstr( bytes, search );
if ( found != NULL )
{
    *found = '\0';
    char *lineStart = strrchr( bytes, '\n' );
    char *lineEnd = strchr( found + 1, '\n' );
        .
        .

如果其中一个或两个都为NULL,我会告诉你它是什么意思。

另外,使用fseek()来计算文件中有多少字节在技术上是错误的,因为ftell()不返回字节偏移量,但只返回fseek()可以返回的值文件中的相同位置。有一些架构,其中ftell()返回无意义的数字。

如果您想知道文件的大小,请在打开的文件中使用stat() - 或fstat()

struct stat sb;
FILE *f = fopen(...)
fstat( fileno( f ), &sb );
off_t bytesInFile = sb.st_size;

另请注意,我没有使用long - 我使用了off_t。使用long存储文件中的字节数是一个严重错误的处方,当32位程序的文件大小超过2 GB时。