我是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 );
答案 0 :(得分:0)
使用open
,read
和write
,与使用fopen
,fread
和fwrite
的情况完全不同(或fgets
和fprintf
)除了任何转换,字节计数和设置创建的文件权限位的负担之外。当write
将诸如1020
之类的值写入文件时,它会写入您要写入的bytes
的编号,并且该编号将存在于文件中且具有相同的<你的硬件使用em> endianness 。
例如,如果您使用unsigned v = 1020;
或0x3fc
(或write (fd, &v, sizeof v);
查看文件,则hexdump
(十六进制为od
)然后fc 03 00 00
它会包含4-bytes
(假设您的硬件是小端)。这些是unsigned
1020
值open
的{{1}}。您无法在文本编辑器中打开该文件,并且希望看到ASCII字符,因为这不是写入文件的内容。
要使用read
和open
查找文件中的行数,您基本上希望'\n'
该文件,将文件读入缓冲区中的一些合理数量的字节时间并计算文件中的'\n'
个字符。
(注意:您还需要检查从文件中读取的最后一个字符是否为+1
以外的其他字符。如果是,您将要添加{{1} }到您的行数以计算最后一行的非POSIX行结束。)
唯一需要注意的是mode
(权限){@ 1}}(权限)您创建的open
新文件。mode_t mode
否则,您将发现自己无法访问新创建的文件。这就是为什么open提供O_CREAT
作为提供open, read, write
标志的第三个参数。
如果您只对程序I / O使用STDERR_FILENO
,则必须在发生错误时向终端infile
提供错误消息输出。您可能需要一个简短的帮助函数,它将为此目的写入 string 消息。
将各个部分拼凑在一起,你可以做同样的事情,同时坚持你的事业。以下代码将outfile
和infile
名称作为程序的前两个参数,一次读取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);