2015-11-06 2 views
0

У меня есть программа, которая должна сделать это:прочитанной строки из файла, и возвращает строки, содержащие слово

  1. Открыть файл
  2. Прочитайте каждую строку посимвольно
  3. Печать в другом файле строки, содержащие слово

Я должен соблюдать следующие условия: открывать файлы с помощью метода дескрипторов файлов, читать символ по символу и использовать функции <string.h>. Я нашел другой подобный вопрос, но на самом деле разные .. и fopen используется для доступа к файлам.

Это мой код (функция вызывается главным в цикле):

#include<stdio.h> 
#include<stdlib.h> 
#include<sys/types.h> 
#include<unistd.h> 
#include<fcntl.h> 
#include<string.h> 

#define LINELENGTH 2000 

int readLine(int in_fd,int out_fd,char** _line,char* word){ 
    /*what the functions return: 
    -1 end of file, 
    0 if word not founded 
    >0 word founded -> return the amount of line characters 
    */ 

    //declarations 
    int counter,lineEnded,fileEnded,readReturn; 
    char character; 
    char* line = *_line; 

    //line acquisition 
    counter=lineEnded=fileEnded=readReturn=0; 
    do{ 
     //read 
     readReturn=read(in_fd,&character,1); 

     //depends by the read return value: 
     if(readReturn==-1){    //-error 
      perror("read error"); 
      exit(EXIT_FAILURE);} 
     else if(readReturn==0){   //-end of file 
      if(counter==0) fileEnded=1; 
      else lineEnded=1;} 
     else if(character=='\n'){  //-character read is '\n' 
      line[counter]=character; 
      lineEnded=1;} 
     else{       //-character read 
      line[counter]=character; 
      counter++;} 
    }while((counter<LINELENGTH-1) && (!lineEnded) && (!fileEnded)); 
    if(fileEnded) return -1; 

    //if "line" were filled and then stop reading, so the input 
    //line probably continue; this "if" force to add 
    //a '\n' character at the end of line and increase counter 
    if(!lineEnded){ 
     counter+=1; 
     line[counter]='\n';} 

    //copy the line in a new string - 3 NOT WORKING SOLUTIONS 
    //1st solution: Segmentation Fault 
    char* local_line; 
    strncpy(local_line,line,counter+1); 
    //2nd solution: so i try to use this; but this 
    //delete the last character to insert '\n' 
    char* local_line; 
    local_line = strtok(line,"\n"); 
    local_line[counter-1]='\n'; 
    //3rd solution: seems to work but... 
    char* local_line = (char*)malloc(sizeof(char)*(counter+1)); 
    local_line = strtok(line,"\n"); 
    local_line[counter+1] = '\n'; //but this line seems to be ignored; 
      //line written in output file do not contain \n at the end 

    //search "word" in "local_line" 
    char* strstrReturn = strstr(local_line,word); 

    //write line on file represented by out_fd (if word founded) 
    if(strstrReturn==NULL){ 
     free(local_line); //only with the 3rd solution.. but this line 
          //causes Memory Corruption after some fuction cycles! 
     return 0;} 
    else{ 
     write(out_fd,local_line,counter); 
     free(local_line); //only with the 3rd solution.. but causes 
          //Segmentation Fault! 
     return counter; 
    } 
} 


main(int argc,char* argv[]){ 

    //check arguments 
    if(argc!=3){ 
     printf("syntax: exec fileName wordSearch\n"); 
     exit(EXIT_FAILURE);} 

    //declarations 
    int fd_1,fd_2; 
    int readLineReturn=0; 
    //int debug; 
    char* line = (char*)malloc(sizeof(char)*LINELENGTH); 

    //open file for reading 
    fd_1 = open(argv[1],O_RDONLY); 
    if(fd_1<0){ 
     perror("error opening fd_1"); 
     exit(EXIT_FAILURE);} 

    //open file for writing 
    fd_2 = open("outFile.txt",O_WRONLY|O_TRUNC|O_CREAT,0664); 
    if(fd_2<0){ 
     perror("error opening fd_2"); 
     exit(EXIT_FAILURE);} 

    //line acquisition 
    int readLineReturn; 
    do{ 
     readLineReturn = readLine(fd_1,fd_2,&line,argv[2]); 
    }while(readLineReturn!=-1); 

    close(fd_2); 
    close(fd_1); 
    free(line); 
    printf("\n"); 
    exit(EXIT_SUCCESS); 
} 

Это часть кода с проблемами со связанными ошибки выполнения (вы можете найти его в функции).

//copy the line in a new string - 3 NOT WORKING solutions 
    //1st solution: Segmentation Fault 
    char* local_line; 
    strncpy(local_line,line,counter+1); 
    //2nd solution: so i try to use this; but this 
    //delete the last character to insert '\n' 
    char* local_line; 
    local_line = strtok(line,"\n"); 
    local_line[counter-1]='\n'; 
    //3rd solution: 
    char* local_line = (char*)malloc(sizeof(char)*(counter+1)); 
    local_line = strtok(line,"\n"); 
    local_line[counter+1] = '\n'; 

Я думаю, что есть структурная или концептуальная ошибка, но я не могу ее найти.

+1

Пожалуйста, научитесь думать как программист и избегайте таких терминов, как «это не работает». Что именно это делает, это отличается от того, что вы ожидаете? –

+0

'if (! LineEnded) { counter + = 1; line [counter] = '\ n';} char * local_line; strncpy (local_line, line, counter + 1); 'messed. Добавление \ n неправильного места, а не проверка нулевого символа завершена, а не проверка, если 'local_line'' NULL' – chux

+0

@JonathanWood, спасибо, я сделаю это! программа должна читать строку «in_file» по строке (чтение символа строки по символу). Затем проверьте, содержит ли строка слово. Если он содержит, строка записывается в 'out_file', если нет, ничего не делать и читать следующую строку из 'in_file'. Функция «readLine» читает 1 строку, а основная функция используется для чтения нескольких строк. – Fede

ответ

1
char* local_line; 
strncpy(local_line,line,counter+1); 

В этом перед использованием strncpy необходимо выделить память для local_line с помощью malloc или аналогичную функцию.

+0

Хорошо, спасибо. Я пробую это в третьем решении. Но не работает ... – Fede

+1

@Fede: Опять же, «не работает» не помогает. Пожалуйста, научитесь думать как программист. –

+0

@ JonathanWood Извините, хорошо, извините, но на моем первом посте написано, что это решение имеет проблемы. Если я использую malloc, эта строка 'local_line [counter + 1] = '\ n';' кажется, игнорируется. И в конце функции два разных 'free' (которые выполняются в зависимости от выхода функции) вызывают ошибки памяти или ошибки сегментации. – Fede

Смежные вопросы