c程序使用系统调用计算文件中的行数

c程序使用系统调用计算文件中的行数,c,C,我正在编写一个C程序,使用诸如open()、read()、write()close()之类的系统调用来计算文件中的行数。我用库调用fopen()、fread()、fwrite()所做的程序运行得很好,但仅用系统调用,我就卡住了 int fd1; // file descriptor fd1=open("f1.txt",O_RDONLY); // opening file read(fd1, buffer , 1); // reading 1 byte from file // no

我正在编写一个C程序,使用诸如open()、read()、write()close()之类的系统调用来计算文件中的行数。我用库调用fopen()、fread()、fwrite()所做的程序运行得很好,但仅用系统调用,我就卡住了

int fd1;    // file descriptor
fd1=open("f1.txt",O_RDONLY);   // opening file
read(fd1, buffer , 1);   // reading 1 byte from file
// now comparing
if (buffer == '\n')
line++;
我的问题是:

如果(myb=='\n')

我不知道如何比较缓冲区中的数据。我试图使用缓冲区,但没有成功。请帮忙

您将指针(
缓冲区
)与字符(
“\n”
)进行了比较

您应该取消对指针的引用,例如:

if (*buffer == '\n')

您将指针(
缓冲区
)与字符(
“\n”
)进行了比较

您应该取消对指针的引用,例如:

if (*buffer == '\n')


除了您提供的缓冲之外,系统调用不会执行任何缓冲,因此您确实不希望一次只读取一个字节。在某种程度上,更大的缓冲区更好,但是在超过几千字节(大约)的情况下,增加缓冲区大小只会在使用更多内存的情况下获得更高的性能

char buffer[16384];
int bytes_read;
unsigned lines = 0;

int fd1 = open("name.txt", O_RDONLY);

while (bytes_read = read(fd1, buffer, sizeof(buffer)) {
    int i;
    for (i=0; i<bytes_read; i++)
        if (buffer[i] == '\n')
            ++lines;
}
char缓冲区[16384];
读取整数字节;
无符号行=0;
int fd1=打开(“name.txt”,仅限ordu);
while(bytes_read=read(fd1,buffer,sizeof(buffer)){
int i;

对于(i=0;i系统调用除了您提供的缓冲外,不做任何缓冲,因此您确实不希望一次只读取一个字节。在某种程度上,更大的缓冲区更好,但超过几千字节(或更多)增加缓冲区大小只会获得更多的性能,以换取使用更多内存

char buffer[16384];
int bytes_read;
unsigned lines = 0;

int fd1 = open("name.txt", O_RDONLY);

while (bytes_read = read(fd1, buffer, sizeof(buffer)) {
    int i;
    for (i=0; i<bytes_read; i++)
        if (buffer[i] == '\n')
            ++lines;
}
char缓冲区[16384];
读取整数字节;
无符号行=0;
int fd1=打开(“name.txt”,仅限ordu);
while(bytes_read=read(fd1,buffer,sizeof(buffer)){
int i;

对于(i=0;i这里我解决了如何计算文件中的单词

while(sc !=EOF)
{
sc=fgetc(at);    // at is file stream 

        if(isspace(sc)) sp=1;
        else if(sp) {
            ++words;
        sp=0;
        }
}

在这里,我将解决如何计算文件中的单词

while(sc !=EOF)
{
sc=fgetc(at);    // at is file stream 

        if(isspace(sc)) sp=1;
        else if(sp) {
            ++words;
        sp=0;
        }
}

什么是
myb
?它不会出现在你发布的代码中的任何地方。myb是buffer(mybuffer…myb)什么是
myb
?它不会出现在你发布的代码中的任何地方。myb是buffer(mybuffer…myb)他只使用一个1字符的缓冲区,因此缓冲区可以是一个简单的
char
(名称仍然合适)在这种情况下,解决方案将改为
read(fd1,&buffer,1);
。在这种情况下,调用
read(fd1,buffer,1);
可能会失败,因为buffer不是有效的指针。他只使用一个1字符的缓冲区,所以buffer可以是一个简单的
char
(名称仍然合适)在这种情况下,解决方案将改为
read(fd1,&buffer,1);
。在这种情况下,调用
read(fd1,buffer,1);
可能会下降,因为缓冲区不是一个有效的指针。@user114500:我正在查找我代码的这一部分中的打字错误,或者我发布的内容与您的评论之间的任何差异。如果有差异,我似乎会丢失它。我想在我的程序中再添加一个功能。要计算字数,有人能告诉我如何计算fileBasical中的字数吗只需计算从空白到其他内容的转换(反之亦然)。使用
read
时,您必须小心地管理缓冲区,因为缓冲区的结尾可能发生在单词中间、空格中间,或者正好在转换时。@user114500:我正在查找代码的这一部分中的拼写错误,或者我发布的内容与您的评论之间的任何差异。如果有差异,我似乎会丢失它。我想再添加一个我的程序的功能。要计算字数,有人能告诉我如何计算文件中的字数吗?基本上,你计算从空白到其他内容的转换(反之亦然)使用
read
时,您必须小心地管理缓冲区,因为缓冲区的结尾可能发生在字的中间、空格的中间或转换处。字不是行,虽然
isspace
将匹配换行符,但它也将匹配制表符和空格。另外
fgetc
是一个stdio函数,而不是系统调用您最初请求的。单词不是行,虽然
isspace
将匹配换行符,但它也将匹配制表符和空格。另外
fgetc
是一个stdio函数,而不是您最初请求的系统调用。