使用C

时间:2016-07-02 01:45:29

标签: c linux unix

我是C语言的初学者,unix没有太多经验。我试图使用unix系统调用计算文件内的总行数,但我没有得到任何结果。我的lineCount总是0,我不知道为什么?如果可能,我希望有人帮我弄清楚行数。谢谢

int lineCount = 0;
while (*buffer != '\0') // to check the end of the file
{
    read( in_fd, buffer, BUFFERSZ);
    if (*buffer == '\n')
    {
       lineCount++;
    }
}

printf("Linecount: %i \n", lineCount );

3 个答案:

答案 0 :(得分:0)

使用openreadwrite,与使用fopenfreadfwrite的情况完全不同(或fgetsfprintf)除了任何转换,字节计数和设置创建的文件权限位的负担之外。当write将诸如1020之类的值写入文件时,它会写入您要写入的bytes的编号,并且该编号将存在于文件中且具有相同的<你的硬件使用em> endianness 。

例如,如果您使用unsigned v = 1020;0x3fc(或write (fd, &v, sizeof v);查看文件,则hexdump(十六进制为od)然后fc 03 00 00它会包含4-bytes(假设您的硬件是小端)。这些是unsigned 1020open的{​​{1}}。您无法在文本编辑器中打开该文件,并且希望看到ASCII字符,因为这不是写入文件的内容。

要使用readopen查找文件中的行数,您基本上希望'\n'该文件,将文件读入缓冲区中的一些合理数量的字节时间并计算文件中的'\n'个字符。

注意:您还需要检查从文件中读取的最后一个字符是否为+1以外的其他字符。如果是,您将要添加{{1} }到您的行数以计算最后一行的非POSIX行结束。)

唯一需要注意的是mode(权限){@ 1}}(权限)您创建的open新文件。mode_t mode否则,您将发现自己无法访问新创建的文件。这就是为什么open提供O_CREAT作为提供open, read, write标志的第三个参数。

如果您只对程序I / O使用STDERR_FILENO,则必须在发生错误时向终端infile提供错误消息输出。您可能需要一个简短的帮助函数,它将为此目的写入 string 消息。

将各个部分拼凑在一起,你可以做同样的事情,同时坚持你的事业。以下代码将outfileinfile名称作为程序的前两个参数,一次读取65K bytes '\n',计算outfile中的writeliteral该文件然后将结果写入#include <sys/stat.h> #include <fcntl.h> #include <unistd.h> enum { BUFFERSZ = 1 << 16 }; /* 65K buffer size */ void writeliteral (int fildes, const char *s); int main (int argc, char **argv) { if (argc < 3) { writeliteral (STDERR_FILENO, "error: insufficient input.\n"); writeliteral (STDERR_FILENO, "usage: progname infile outfile\n"); return 1; } char buf[BUFFERSZ] = ""; unsigned i = 0, nlines = 0; ssize_t n = 0; mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; int fd = open (argv[1], O_RDONLY); if (fd == -1) { /* validate file open for reading */ writeliteral (STDERR_FILENO, "error: infile open failed.\n"); return 1; } while ((n = read (fd, buf, sizeof buf)) > 0) /* read 65k chars */ for (i = 0; i < n; i++) /* count newlines in buf */ if (buf[i] == '\n') nlines++; if (buf[i - 1] != '\n') /* account for non-POSIX line end */ nlines++; close (fd); /* close file */ /* open outfile for writing, create if it doesn't exist */ if ((fd = open (argv[2], O_WRONLY | O_CREAT, mode)) == -1) { writeliteral (STDERR_FILENO, "error: outfile open failed.\n"); return 1; } write (fd, &nlines, sizeof nlines); /* write nlines to outfile */ close (fd); /* close file */ return 0; } /** write a string literal to 'fildes' */ void writeliteral (int fildes, const char *s) { size_t count = 0; const char *p = s; for (; *p; p++) {} count = p - s; write (fildes, s, count); } ,以计算该文件的任何非POSIX行结尾。 $ nl -ba ../dat/captnjack.txt 1 This is a tale 2 Of Captain Jack Sparrow 3 A Pirate So Brave 4 On the Seven Seas. 是作为错误消息的帮助者提供的:

$ ./bin/readwrite_lineno ../dat/captnjack.txt ../dat/jacklines.dat
$ hexdump -n 16 -C ../dat/jacklines.dat
00000000  04 00 00 00                                       |....|
00000004

示例输入文件

printf

示例使用/输出

export const routes:RouterConfig = [
    { path: "",redirectTo:"welcome",pathMatch:"full"},
    { path: "welcome", component: WelcomeComponent },
    { path: "help",component: HelpComponent},
    { path: "**",redirectTo:"welcome"}
];

仔细看看,如果您有任何疑问,请告诉我。它向您展示了为什么您在完成后可能更喜欢# Uncomment this line to define a global platform for your project platform :ios, '9.0' # Comment this line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for Promposal target 'Promposal' do pod 'Firebase', '>= 2.5.0' # Pods for testing target 'PromposalTests' do inherit! :search_paths pod 'Firebase', '>= 2.5.0' end end 函数格式说明符系列。

答案 1 :(得分:0)

您的代码仅检查*buffer换行符,这是您阅读的每个BUFFERSZ块的第一个字符,即您的代码甚至不查看大部分输入。 (它也没有正确检查文件结尾:你需要查看read的返回值。)

这是一个使用fgetc模仿read的简单解决方案:

size_t lines = 0;
char c;
while (read(in_fd, &c, 1) == 1) {
    if (c == '\n') {
        lines++;
    }
}

printf("Linecount: %zu\n", lines);

如果您也无法使用printf,则可以采用以下快速解决方法:

static void print_n(size_t n) {
    if (n / 10) {
        print_n(n / 10);
    }
    char c = '0' + n % 10;
    write(1, &c, 1);
}

...
write(1, "Linecount: ", strlen("Linecount: "));
print_n(lines);
write(1, "\n", 1);

答案 2 :(得分:-1)

参考:Count number of line using C 使用代码

FILE *fp = fopen("myfile.txt");
 int ch; 
int count=0;
 do { ch = fgetc(fp); 
if( ch== '\n')
 count++;
 }while( ch != EOF ); 
printf("Total number of lines %d\n",count);