簡體   English   中英

使用C中的文件描述符對文件的行進行計數

[英]Count lines of a file using file descriptor in C

我正在嘗試計算通過文件描述符讀取的文件的行數,但我不知道我在做什么錯,因為它不會浪費。

這是代碼:

fd_openedFile = open(filename, O_RDONLY)        
char *miniBuffer[1];
int lineCounter = 0;
while( read(fd_openedFile, miniBuffer, 1) >0) {
    if (*miniBuffer[0] == '\n')
        lineCounter++;
}

該軟件從不輸入“ if”,並且我測試了很多我認為可以起作用的變體,但沒有一個起作用(對我來說這才更有意義)。

任何幫助將不勝感激。

非常感謝你!

我在下面添加了完整的代碼:

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

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

void err_sys(const char* cadena, int continueExecuting) {
    perror(cadena);
    if (continueExecuting == 0)
        exit(1);
}

int main()
{
    //vars
    char filename[200];
    int fd_output = 1;
    int fd_openedFile = -1;
    int fd_newFile = -1;


    //Ask for the file and open it
    while (fd_openedFile < 0){
        write(fd_output, "Write the filename: ", 20);
        scanf("%s", filename);
        if ((fd_openedFile = open(filename, O_RDONLY)) < 0)
            err_sys("Error opening the original file", 1);
    }

    //Construct the new file's name
    char *partOfOldFilename = strtok(filename, ".");
    char newFileName[208], finalPart[8];
    strcpy(newFileName,  partOfOldFilename);
    strcpy(finalPart, "OUT.txt");
    strcat(newFileName, finalPart);

    //Create the new file
    if ((fd_newFile = open(newFileName, O_WRONLY | O_CREAT)) < 0)
        err_sys("Error opening the new file", 1);

    //Count the number of lines
    char miniBuffer[1];
    int lineCounter = 0;
    while( read(fd_openedFile, &miniBuffer[0], 1) >0) {
        write(fd_output, "R", 1); //To debug
        if (miniBuffer[0] == '\n') {
            lineCounter++;
            write(fd_output, "1", 1); //To debug
        } else {
            write(fd_output, "0", 1); //To debug
            write(fd_output, miniBuffer, 1); //To debug
        }
    }

    lseek(fd_openedFile,0,SEEK_SET);
    write(fd_output, "=========\n", 10); //To debug


    //Count the number of chars per line
    char* charsPerLine[lineCounter];
    lineCounter = 0;
    int charCounter = 0;
    while( read(fd_openedFile, miniBuffer, 1) >0){
        write(fd_output, "C", 1); //To debug
        if (miniBuffer[0] == '\n') {
            *(charsPerLine[lineCounter]) = charCounter +'0';
            lineCounter++;
            charCounter = 0;
            write(fd_output, "1", 1); //To debug
        } else {
            write(fd_output, "0", 1); //To debug
            write(fd_output, miniBuffer, 1); //To debug
            charCounter ++;
        }
    }
    lseek(fd_openedFile,0,SEEK_SET);
    write(fd_output, "END", 4); //To debug

    //Write a copy of the original file starting each line with the number of chars in it
    lineCounter = 0;
    int bufSize = 1;
    char buffer[bufSize];
    //First number write
    if (write(fd_newFile,charsPerLine[lineCounter], bufSize)!=bufSize)
        err_sys("write_error", 0);
    lineCounter++;
    while( read(fd_openedFile, buffer, bufSize) >0){
        if (write(fd_newFile,buffer, bufSize)!=bufSize)
            err_sys("write_error", 0);
        if (buffer[0] == '\n') {
            if (write(fd_newFile,charsPerLine[lineCounter], bufSize)!=bufSize)
                err_sys("write_error", 0);
            lineCounter++;
        }
    }

    //Finish program
    if (close(fd_openedFile)!=0) err_sys("error closing original file's file descriptor", 0);
    if (close(fd_newFile)!=0) err_sys("error closing new file's file descriptor", 0);
    return 0;
}

該代碼假定文件是.txt,並且每行的末尾都有一個“換行符”,並且它正在開發中。

再次感謝。

您沒有為miniBuffer分配任何內存, miniBufferchar指針的數組。 這並不是真正的問題-問題在於,它首先不應該是char指針數組。 您只需要使其成為char數組即可,如下所示。

char miniBuffer[1];

然后,另一個更改是檢查數組的單個元素是否為\\n字符。

if (miniBuffer[0] == '\n')

您可能會發現,通過增加數組的大小並使用諸如strchr功能來查找字符串中的任何\\n ,來讀取較大的塊會更有效。 您將需要存儲read返回的金額,以便可以適當地NUL終止字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM