当在txt上写入的输入数据大于16kb时,应用程序崩溃(C编程)

时间:2015-08-12 14:24:37

标签: c file input io output

我正在尝试创建一个从txt文件(像x1,x2这样的坐标)获取输入的程序,并将其存储在元素上以SVG格式写入。我下面写的代码实际上是有效的。问题是当我输入大于16kb的输入时,在svg文件应用程序上写入时会崩溃。所以我实际上找不到问题。它应该是关于“strcat(str_joined,svg [i] .xy);”因为我将这么多字符串加入到一个字符串变量中。

输入示例:

339, 52
339, 52
339, 52
338, 53
338, 53
337, 54
337, 54
337, 54
337, 55
337, 55
336, 56
336, 56
336, 56
336, 57
335, 57
335, 56
334, 56
334, 56
333, 56
332, 56
332, 56
331, 56
331, 56
330, 56
330, 56
329, 56

输出示例:<svg><polyline points='339,52 339,52 339,52 338,53 338,53 337,54 '/></svg>

And Code:我只是将generate_svg部分放在代码中。

void generate_svg(char *input, char *output)
{         
    //INPUT OPERATİONS //

FILE *fp;
int array_size = 0, i=0, max_lines = 0;  // Line counters
char c;  // To store a character read from file to check whether newline or not
char *str_joined = NULL;

// Open the file
fp = fopen(input, "r");

//Count the number of lines for the array size 
for (c = getc(fp); c != EOF; c = getc(fp))
    if (c == '\n') 
        array_size = array_size + 1;
fclose(fp);


// read the file into an array of coordinates
Coord *coord = malloc(array_size * sizeof *coord); //preallocation for performance
fp = fopen(input, "r");
while(!feof(fp))
{
   //check whether input getting correctly             
   if(fscanf(fp, "%d, %d", &coord[i].x, &coord[i].y)==2)      
      i++;           
}
fclose(fp);

//OUTPUT OPERATIONS
max_lines = i;
SVG *svg = malloc(array_size * sizeof *svg); // allocate memory
size_t total_length=0, length=0; //total length and length of string
for(i=0; i<max_lines; i++)
{
    sprintf(svg[i].xy , "%d,%d ", coord[i].x, coord[i].y);
    total_length += strlen(svg[i].xy); 
    //printf("%s\n", svg[i].xy);
}

str_joined = (char*)malloc(total_length * sizeof *str_joined); // allocate memory for joined strings
str_joined[0] = '\0'; // empty string we can append to

for(i=0; i<max_lines; i++)
{
         strcat(str_joined, svg[i].xy);
         length = strlen(str_joined);

         str_joined[length+1] = '\0';           /* followed by terminator */

}

FILE *fp_out;
fp_out = fopen(output,"w+"); //erase the content and write on it if exists or create the file and write on it

if(fp_out == NULL)
{
  printf("Error");           
}
else
{
  fprintf(fp_out, "<svg><polyline points='%s'/></svg>" , str_joined);

   printf("Operation successful.\n");
}
//printf("%s\n", str_joined);

}

所以任何帮助将不胜感激。提前谢谢。

// UPDATE

标题:

//definitions
#define MAX_FILE_NAME 100
#define OUTPUT_FILE_NAME "svg_output.svg"

void generate_svg(char *input, char *output);
//storage for coordinates
typedef struct Coord
{
    int x;
    int y;
}Coord;

typedef struct SVG
{
  char xy[20];        

}SVG;

So application crash image :

1 个答案:

答案 0 :(得分:0)

好的,真的感谢你的帮助。我解决了这个问题。我配置了Visual Studio for C编译,并将我的代码标准化为C99。所以我的代码的最终形状如下,它的工作原理。

void generate_svg(char *input, char *output)
{

    //INPUT OPERATİONS //

    FILE *fp, *fp_out;  SVG *svg;  Coord *coord;
    int array_size = 0, i=0, max_lines = 0;  // Line counters
    char c;  // To store a character read from file to check whether newline or not
    char *str_joined = NULL;
    size_t total_length=0, length=0;

    // Open the file
    fp = fopen(input, "r");
    if (fp == NULL)
    {
        perror("Error");
    }
    else
    {
         //Count the number of lines for the array size 
        for (c = getc(fp); c != EOF; c = getc(fp))
            if (c == '\n') 
                array_size = array_size + 1;
        fclose(fp);
    }




    // read the file into an array of coordinates
    coord = (Coord*)malloc(array_size * sizeof(Coord)); //preallocation for performance
    fp = fopen(input, "r");
    if (fp == NULL)
    {
        perror("Error");
    }
    else
    {
        while(!feof(fp))
        {
           //check whether input getting correctly             
           if(fscanf(fp, "%d, %d", &coord[i].x, &coord[i].y)==2)      
              i++;           

        }
        fclose(fp);
    }


    //OUTPUT OPERATIONS
    max_lines = i;
    svg = (SVG*)malloc(array_size * sizeof(SVG)); // allocate memory
     //total length and length of string
    for(i=0; i<max_lines; i++)
    {
        sprintf(svg[i].xy , "%d,%d ", coord[i].x, coord[i].y);
        total_length += strlen(svg[i].xy); 
        //printf("%s\n", svg[i].xy);
    }

    str_joined = (char*)malloc(total_length * 2); // allocate memory for joined strings
    str_joined[0] = '\0'; // empty string we can append to

    for(i=0; i<max_lines; i++)
    {
        strcat(str_joined, svg[i].xy);

    }

    fp_out = fopen(output,"w+"); //erase the content and write on it if exists or create the file and write on it
    if (fp_out==NULL)
    {
        perror("Error");
    }
    else
    {
        fprintf(fp_out, "<svg><polyline points='%s'/></svg>" , str_joined);
        printf("Operation successful.\n");
    }


    //printf("%s\n", str_joined);




}