2012-11-13 36 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]; 

而且,正如别人所说,你分配一堆内存,而不是试图释放它。在循环之外分配一次,或者跳过分配步骤并直接声明它们。