gpt4 book ai didi

c - 系统调用 - 如何在字符串中查找字符(如果该字符存在)

转载 作者:行者123 更新时间:2023-11-30 15:58:01 25 4
gpt4 key购买 nike

我对系统调用非常陌生。我想我可以使用 Index 但不太确定如何实现。假设我想查找一个包含每个“:”和“>”数据的文件

例如,我有一个 myfile.txt,其中包含以下内容:

你好:这是一个测试 对于(1 = 0 i > 10); 该行应写入两个文件,因为它同时包含 : 和 >

所以我要打开两个文件用于写入,一个用于读取(myfile.txt),当我找到包含“:”的行时,我会将其写入到 colon.txt 文件中。当该行包含“>”字符时,我会将其写入greaterthen.txt 文件中。

更多评论: 是的,我需要实现缓冲区。

最佳答案

抱歉,我看错问题了。

您需要考虑几件事。是的,您需要一个缓冲区,但如果您的行比缓冲区大,您也有句柄。因此,您需要两个缓冲区,一个用于读入,另一个用于组装整行。虽然可以在一个缓冲区中完成,但它似乎过于复杂。

我的 C 很生锈,但这似乎有效。它需要错误处理,并且我确信它与您的编码风格不匹配,但我的一次完成的测试似乎有效。读取缓冲区异常小,以演示行大于缓冲区的情况 - 在现实世界中,您的读取缓冲区会大得多。

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

int findchar(char*, int, char);

int main()
{
size_t dataIn = open("myfile.txt", O_RDONLY);
size_t gtOut = open("greaterthan.txt", O_CREAT | O_WRONLY);
size_t coOut = open("colon.txt", O_CREAT | O_WRONLY);

char buffer[12];
int iReadCnt;
char* lineBuffer = NULL;
int lineBufferSize = 0;

// read input file until no more input
while (iReadCnt = read(dataIn, buffer, sizeof(buffer)))
{
int x;
int n;
char* b;

// add buffer to dynamic line buffer
n = lineBufferSize + iReadCnt;
b = malloc(n);
memcpy(b, lineBuffer, lineBufferSize);
memcpy(&b[lineBufferSize], buffer, iReadCnt);
// free old buffer if exists
if (lineBuffer)
{
free(lineBuffer);
}

lineBufferSize = n;
lineBuffer = b;

// look for end of line
x = findchar(lineBuffer, lineBufferSize, '\n');

if (x >= 0)
{
int gtPos;
int coPos;
int n;
char* b;

// look for gt
gtPos = findchar(lineBuffer, x, '>');

if (gtPos >= 0)
{
write(gtOut, lineBuffer, x + 1);
}

// look for colon
coPos = findchar(lineBuffer, x, ':');

if (coPos >= 0)
{
write(coOut, lineBuffer, x + 1);
}

// remove line from buffer
n = lineBufferSize - (x + 1);
b = malloc(n);
memcpy(b, &lineBuffer[x + 1], n);
free(lineBuffer);
lineBufferSize = n;
lineBuffer = b;
}
}

// close files
close(dataIn);
close(gtOut);
close(coOut);
exit(0);
}

// simple function to find a character in a buffer
int findchar(char* buffer, int len, char c)
{
int i;
for (i = 0; i < len; ++i)
{
if (buffer[i] == c)
{
return i;
}
}

return -1;
}

关于c - 系统调用 - 如何在字符串中查找字符(如果该字符存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10117239/

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