2012-11-13 33 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?如果是這樣,那麼您的代碼行可能會以\ r \ n而不是\ n結尾,而您的代碼似乎只能檢查\ n。 – atkretsch

+0

更改此:「RB」這樣的:「R」,看看是否讓你更接近你在找什麼。 – WhozCraig

+0

我在Ubuntu上創建了這個文件,我嘗試過使用「r」和「rb」。似乎沒有區別 – user1822221

回答

0

您不正在閱讀從文件更正。在你的第一張圖片上。在第二

 ""oo  o o o 

開始

 o ""oo " o o o 

不要做了很多有意義的,因爲它的第一行。因爲我們正在談論第一行,所以不必處理空行。

它接縫你是在'ECT閱讀-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]時使用calloc()代替malloc(),這可能幫助。它甚至可能是你的output[i]變量是什麼把你額外的換行符。

4)即使初始化爲空字符串,您也可以很容易地溢出output[i],因爲您正在循環12次並寫入最多11個字符。空終止符爲11 * 12 + 1 =寫入100字節數組的133字節。

一般來說,除非這是一個需要使用malloc()的類指定,否則我不明白爲什麼你不只是在程序開始時聲明一次變量,而是在每次開始時將它們歸零循環:

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

而且,正如別人所說,你分配一堆內存,而不是試圖釋放它。在循環之外分配一次,或者跳過分配步驟並直接聲明它們。