2012-11-13 3 views
1

이 코드가있는 출력에서 ​​다른 모든 행을 비워 두는 데 문제가 있습니다. 원하는 출력은 다음과 같습니다 http://paste.ubuntu.com/1354365/출력시 다른 모든 행을 비워 두는 중

난다면 : http://paste.ubuntu.com/1356669/

사람이 왜 다른 모든 라인이 빈 줄을 얻고 아이디어를 가지고 있습니까?

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

FILE *fp; 
FILE *fw; 


int main(int argc, char *argv[]){ 
char buffer[100]; 
char *fileName = malloc(10*sizeof(char)); 
char **output = calloc(10, sizeof(char*)); 
char **outputBuffer = calloc(10, sizeof(char*)); 

fw = fopen("calvin.txt", "w+"); 

for(int y = 0; y < 6; y++){ 
    for(int i = 0; i < 10; i ++) 
    { 
     output[i] = malloc(100); 
    } 

    for(int x = 0; x < 12; x++){ 
     sprintf(fileName,"part_%02d-%02d", x, y); 
     fp = fopen(fileName, "rb"); 

     if(fp == NULL) 
     { 
      printf("Kan ikke åpne den filen(finnes ikke/rettigheter)\n"); 
     } 
     else if(fp != NULL){ 

      memset(buffer, 0, 100); 
      for(int i = 0; i < 10; i++){ 
       outputBuffer[i] = malloc(100); 
      } 


      fread(buffer, 1, 100, fp); 


      for(int i = 0; i < 100; i++){ 
       if(buffer[i] == '\0') 
       { 
        buffer[i] = ' '; 
       } 
       else if(buffer[i] == '\n') 
       { 
        buffer[i] = ' '; 
       } 
      } 
      for(int i = 0; i < 10; i++) { 
       strncpy(outputBuffer[i], buffer + i * 10, 10); 

       strncat(output[i], outputBuffer[i]+1, 11); 


      }      
     } 

    } 

    for(int i = 0; i < 10; i++){ 
     printf("%s\n", output[i]); 

    } 

} 
fclose(fp); 
free(fileName); 

} 
+0

입력 파일이 Windows에서 생성 되었습니까? 그렇다면 줄이 \ n \ n 대신 \ r \ n으로 끝나고 코드가 \ n 만 확인하는 것으로 보입니다. – atkretsch

+0

다음과 같이 변경하십시오. "rb"를 this : "r"로 변경하면 찾고있는 것과 더 가까워 지는지 확인하십시오. – WhozCraig

+0

우분투에서 파일을 만들었고 "r"과 "rb"둘 다 시도했습니다.아무런 차이가없는 것처럼 보입니다. – user1822221

답변

0

파일을 수정하지 않고 읽는 중입니다. 첫 번째 이미지에 있습니다. 두 번째

 ""oo  o o o 

에 처음

 o ""oo " o o o 

에서 많은 감각 그 때문에 첫 번째 행을하지 마십시오. 첫 줄에 대해 이야기하고 있기 때문에 빈 줄을 사용하지 않아도됩니다.

:

그것은 당신이 ''요법에 "다른 O를 통해 인쇄"왼쪽 그래서 -2 문자를 읽고있는 솔기 ..

것은하지 않을 수 있습니다, 가장 효율적으로 솔루션을이 멀리보십시오

int read(char *file) 
{ 
    FILE *fp = NULL;   
    int size = 0, pos = 0,i; 
    fp = fopen(file,"r"); 
    if (!fp) return 0; 

    for(; ((getc(fp))!=EOF); size++); // Count the number of elements in the file 

    fclose(fp); 


    char buffer[size]; 

    fp = fopen(file,"r"); 

    if (!fp) return 0; 

    while((buffer[pos++]=getc(fp))!=EOF); // Saving the chars into the buffer 

    for(i = 0; i < pos; i++)    // print them. 
     printf("%c",buffer[i]); 

    fclose(fp); 
    return 1; 
} 
+0

왜 그런 일이 일어날 지 아십니까? – user1822221

+0

내 컴퓨터에서 테스트 할 수 있도록 calvin.txt에 대한 링크를 넣을 수 있습니까? – dreamcrash

+0

http://paste.ubuntu.com/1356729/ -> 방금 calvin.txt에서 cat을 사용하여 pastebinit에 파이프를 연결했습니다. 그래서 이것은 calvin.txt 파일에있는 텍스트입니다. – user1822221

0

이 부분은 문제가있는 것 같다

  strncpy(outputBuffer[i], buffer + i * 10, 10); 

      strncat(output[i], outputBuffer[i]+1, 11); 

1) 당사는 별도의 outputBuffer 단계를 사용하는 것이 필요하다?

2) strncpy()은 복사하는 문자열의 널 종료를 보장하지 않습니다.

3)보다 의미있게 output[i]이 초기화되지 않았으므로 strncat()은 이미 거기에있는 모든 정크가 발생한 후에 문자열을 연결합니다. output[i]을 만들 때 malloc() 대신 calloc()을 사용하면 도움이 될 수 있습니다.output[i] 변수가 여분의 개행 문자를 포함 할 가능성이 있습니다.

4) 빈 문자열로 초기화 된 경우에도 12 시간 반복하고 최대 11 자까지 쓰기 때문에 output[i]을 쉽게 오버플로 할 수 있습니다. null 종결 자에 대한 11 * 12 + 1 = 100 바이트 배열에 쓰여진 133 바이트.

일반적으로 malloc()을 사용해야하는 클래스 할당이 아니라면 왜 프로그램을 시작할 때 변수를 한 번만 선언하고 각 변수를 시작할 때 0으로 정의하지 않는지 이해할 수 없습니다. 루프 :

char fileName[10]; 
char output[10][100]; 
char outputBuffer[10][100]; 

다른 사람의 말처럼, 많은 양의 메모리를 할당하고 해제하지 않으려 고합니다. 루프 외부에서 한 번 할당하거나 할당 단계를 건너 뛰고 직접 선언하십시오.

관련 문제