似乎无法从此文件中获取行数

时间:2014-07-15 19:02:51

标签: c++ linux

我试图读取文件并找出其中有多少行。 这些代码片段没有' if'错误处理。 ...

int fd = -1;
struct stat buff;
char * logbuff;

fd = open("/home/path/to/test", O_RDONLY, 0);

fstat(fd, &buff);

logbuff = 
        (char*)mmap(
            NULL,                   //OS chooses address
            buff.st_size,           //Size of file
            PROT_READ,              //Read only
            MAP_ANON|MAP_SHARED,    //copy on write
            fd,
            0
            );

const char * ch = &logbuff[0];
    for ( i = 0; i < buff.st_size; i++ ) {
        if ( ch[i] == '\n' ) {
            newlines++;

            cout << ch[i];
        }
    }

cout << "lines: " << newlines << endl;

我得到的行:0&#39;

我有一个

1 个答案:

答案 0 :(得分:0)

让我们阅读MAP_ANONMAP_ANONYMOUS的文档:

  

MAP_ANON

     

MAP_ANONYMOUS的同义词。弃用。

     

MAP_ANONYMOUS

     

任何文件都不支持映射;其内容初始化为零。   fd和offset参数被忽略;但是,有些实现需要   如果指定了MAP_ANONYMOUS(或MAP_ANON),则fd为-1,以及可移植应用程序   应该确保这一点。将MAP_ANONYMOUSMAP_SHARED结合使用是   自内核2.4以来仅在Linux上受支持。

因此,我们可以看到,当我们使用MAP_ANON时,fd参数被忽略!您实际上在寻找MAP_PRIVATE

  

MAP_PRIVATE

     

创建私有的写时复制映射。映射的更新对映射同一文件的其他进程不可见,并且不会传递到基础文件。未指定在mmap()调用之后对文件所做的更改是否在映射区域中可见。

因此,对mmap的调用应为:

logbuff = mmap(NULL, buff.st_size, PROT_READ, MAP_PRIVATE, fd, 0);

此外,您还需要验证对mmap()的调用是否成功。为此,请确保返回的指针不是MAP_FAILED