#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;的条件打印整行,不确定什么是最好的方法。
答案 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时。