2016-11-24 9 views
0

мне нужна помощь с моей C проекта: мне нужно написать переменного тока программы, которые принимает 2 параметра:C проект с файлами

1) Имя текстового файла (входной_файл), который находится в том же каталоге

2) число к> 0 и создает 2 новых файлов, outfile1 & выходной_файл 2 как:

Outfile 1: к, 2 * к, 3 * к .... Характер INFILE

Outfile 2: к, 2 * к, 3 * к ... ..line из INFILE

Пример:

INFILE

Abcdefg 
123456 
XXXXXX 
01010101 

OUTFILE 1:

Cf25XX101 

ПРОФИЛЬ 2:

XXXXXX 

Я написал код, но его не работает. Есть идеи?

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


char** read_lines(FILE* txt, int* count) { 
    char** array = NULL;   
    int i;     
    char line[100];   
    int line_count;   
    int line_length;   
    *count = 0;     
    line_count = 0;    
    while (fgets(line, sizeof(line), txt) != NULL) {          
     line_count++; 
    } 
    rewind(txt);     
    array = malloc(line_count * sizeof(char *));  
    if (array == NULL) { 
     return NULL;         
    } 
    for (i = 0; i < line_count; i++) {    
     fgets(line, sizeof(line), txt);    
     line_length = strlen(line);     
     line[line_length - 1] = '\0'; 
     line_length--;        
     array[i] = malloc(line_length + 1);   
     strcpy(array[i], line);      
    } 
    *count = line_count;       
    return array;         
} 

int main(int argc, char * argv[]) { 
    char**  array = NULL;  
    FILE*  file  = NULL;  
    const char* filename = NULL;  
    int   i;     
    int   line_count;   
    int   k;     
    char  c;     
    printf("ENTER ONE PHYSICAL NUMBER\n");   
    do{            
     if(k>0) 
      scanf("%d",&k); 

     else{ 
      printf("ENTER ONE PHYSICAL NUMBER\n"); 
      scanf("%d",&k); 
     } 
    }while(k<=0); 
    file = fopen("LEIT.txt", "rt"); 
    if (file == NULL) { 
     printf("CANT OPEN FILE %s.\n", filename); 
     return 1; 
    } 
    array = read_lines(file, &line_count); 
    printf("ARRAY:\n"); 
    for (i = 0; i < line_count; i++) {  
     printf("[%d]: %s\n", (i+1), array[i]); 
    } 
    printf("CALCULATING OUTFILE1 AND OUTFILE2\n"); 
    printf("OUTFILE1:\n"); 
    for(i=0;i<line_count;i++){    
     c=i*k;        
     printf("%c\n",array[c]);    
    } 
    printf("WRITING OUTFILE1 COMPLETE!\n"); 

    printf("OUTFILE2:\n"); 
    for(i=0;i<line_count;i++){    
     c=i*k;         
     printf("%c\n",array[c]);    
    } 
    printf("WRITING OUTFILE2 COMPLETE!\n"); 

    return 0; 

} 

Моя актуальна проблема вычисления и записи в файлы (outfile1 и outfile2) результат ...

ответ

1
  1. Вы должны закрыть файл после завершения чтения/записи его с fclose.

  2. Вы можете создавать и записывать строки в файл с использованием fopen с правильным режимом.

  3. Вы можете выводить форматированную строку в файл с помощью fprintf.

  4. Кажется, что вы не хотите печатать 0-й символ/строку, поэтому в последнем цикле fori должен начинаться с 1 (или начинаться с 0, а добавлять 1 позже).

  5. array[c] - это строка, а не символ. Поэтому при его печати вы должны использовать спецификатор %s вместо %c.

  6. Это не очень хорошая идея, используя char, как указано позже for Петли, если вы не знаете, что входной файл будет очень коротким. signed char может только считать 127 до переполнения (unsigned char может составлять до 255). Но если у вас очень длинный файл, например, тысячи строк, эта программа не будет работать должным образом.

  7. array malloced in function char** read_lines(FILE* txt, int* count). После завершения его использования, вам нужно dealloc или освободить его по телефону

    for (i = 0; i < line_count; i++) { 
        free(array[i]); 
    } 
    

    и затем free(array). Это позволяет избежать утечки памяти.

Модифицированный код приведен здесь. В следующем коде char c не используется. Это часть обработки файлов вывода и до return 0; в основной функции.

printf("CALCULATING OUTFILE1 AND OUTFILE2\n"); 
    printf("OUTFILE1:\n"); 

    // Since we finished using LEIT.txt, close it here. 
    fclose(file); 

    // Mode: "w" - Write file. "+" - Create if not exist. 
    // You can lso use "a+" (append file) here if previous record need to be preserved. 
    FILE *out1 = fopen("OUTFILE1.txt", "w+"); 
    FILE *out2 = fopen("OUTFILE2.txt", "w+"); 

    if ((out1 == NULL) || (out2 == NULL)) { 
     printf("CANT CREATE OUTPUT FILES.\n"); 
     return 1; 
    } 

    // Out file 1. 
    unsigned int count = k; 

    for (i = 0; i < line_count; i++){ 
     while (count < strlen(array[i])) { 
      // This just prints to stdout, but is good for debug. 
      printf("%c", array[i][count]); 

      // Write to the file. 
      fprintf(out1, "%c", array[i][count]); 

      // Calculate c for next char. 
      count += k + 1; 
     } 

     // Before go to next line, minus string length of current line. 
     count -= strlen(array[i]); 
    } 
    printf("\n"); 
    printf("WRITING OUTFILE1 COMPLETE!\n"); 

    // Close file. 
    fclose(out1); 

    // Out file 2. 
    printf("OUTFILE2:\n"); 

    for (i = 1;i < line_count/k; i++){ 
     count = i * k; 

     // This just prints to stdout, but is good for debug. 
     printf("%s\n", array[count]); 

     // Write to the file. 
     fprintf(out2, "%s\n", array[count]); 
    } 
    printf("WRITING OUTFILE2 COMPLETE!\n"); 

    //Close file. 
    fclose(out2); 

    // dealloc malloced memory. 
    for (i = 0; i < line_count; i++) { 
     free(array[i]); 
    } 
    free(array); 
Смежные вопросы