如何在C语言中使用系统调用逐行读取代码

问题描述 投票:0回答:3

[在我的程序中,我目前可以通过char读取具有给定名称“ fichier1.txt”的文件,但是我要寻找的是存储一行(此处为char指针),然后以这种方式显示它:] >

-ligne 1:内容行1

第2行:内容行2

-ect ...

我试图按字符存储char,但是由于它是一个指针,但我对指针非常熟悉,因此我无法存储一行,然后重用该指针存储下一行的char。] >

我不得不说这是学校项目的一部分,我必须使用POSIX标准。

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include <pthread.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    int read_fd, write_fd;
    off_t offset = 0;
    char lu;
    struct stat statFd;
    char *fichier = "fichier1.txt";


    read_fd = open(fichier,O_RDONLY);
    stat(fichier, &statFd);

    if(read_fd == -1){
        perror("open");
        exit(EXIT_FAILURE);
    }

    int i = 0;
    char * line; // variable to store line

    while(lseek(read_fd,offset, SEEK_SET) < statFd.st_size)
    {
        if(read(read_fd, &lu, 1) != -1)
        {
            printf("%c",lu);
            offset++;

        } else {
            perror("READ\n");
            close(read_fd);
            close(write_fd);
            exit(EXIT_FAILURE);
        }
    }

    return 0;
}



我想使用open()函数而不是fopen()

[在我的程序中,我目前可以通过char读取具有给定名称“ fichier1.txt”的文件,但是我要寻找的是存储一行(此处为char指针),然后以这种方式显示它:- ligne 1:...

c linux io posix system-calls
3个回答
0
投票

由于您能够从文件中读取一个接一个的字符,因此while循环中的逻辑将用于在阵列中一次存储整行(最多199个字符,但可以增加),然后显示它:

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



int main(void)
{
    FILE *fptr=fopen( "fichier1.txt","r");
    int  i;
    char arr[200];     //THIS ARRAY WILL HOLD THE CONTENTS OF A LINE TEMPORARILY UNTIL IT IS PRINTED                       
    int temp_index=0,line_number=1;;
    memset(arr,'\0',sizeof(arr));

    while((i=getc(fptr))!=EOF)                         
    {
        if(i!='\n')                                
        {
            arr[temp_index++]=i; 
        }   
        if(i=='\n')
        {
            printf(line %d: %s\n",line_number++,arr);
            temp_index=0;
            memset(arr,'\0',sizeof(arr));
        } 
    }
    return 0;
}

0
投票

在每次迭代中调用lseek可能效率不高,并且在无法搜索的设备上可能会失败。如果不需要存储行,我将按照以下几行编写程序。


0
投票

Observer的回答帮助我修改了程序,谢谢大家的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.