gpt4 book ai didi

c - 如何打印当前行?

转载 作者:行者123 更新时间:2023-11-30 17:16:38 26 4
gpt4 key购买 nike

#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 文件中搜索字符串的程序。当找到时,它打印“找到”,否则打印“未找到”。现在我想打印该字符串所属的完整行。我正在考虑使用 'f==1' 作为 'iffound' 打印整行的条件,但不太确定最好的继续方法是什么。

最佳答案

首先,您需要修复读取,以使从文件中读取的数据以 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。当 32 位程序的文件大小超过 2 GB 时,使用 long 存储文件中的字节数会导致严重错误。

关于c - 如何打印当前行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29589331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com