0

だから私はfgetc行をバッファに読み込むために使用する関数に取り組んでいます。そのバッファを好きなように使用して、次の行でバッファを補充できます。私の関数は機能しますが、ここに示すように、最後の行を処理するために for ループの外側でコードを繰り返す必要があります。

for(i = 0, c = 1; ch != EOF; i++)
{
    ch = fgetc(grab);
    if(ch == 0x0A)
    {
        /*Process Line*/
        c = 1;
    }
    else 
    {
        linetmp = realloc(line, (c + 1) * sizeof(char));
        if(!linetmp)
        {
            free(line);
            free(url);
            printf("\nError! Memory allocation failed!");
            return 1;
        }
        line = linetmp;
        line[c - 1] = ch;
        line[c] = 0x00;
        c++;
    }
}
/*repeat if(ch == 0x0A) statement*/

これをすべて同じループで実行したいのですが、どうすればよいかわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

1

I would recommend that you instead use getline() if you're on a POSIX system.

Also, your logic is strange since you check for EOF in the loop header only, but update ch inside the loop. That means it will run through with ch == EOF, before the loop condition is re-evaluated.

You should try putting the updating and the check together, making the loop header read like this:

for(i = 0, c = 1; (ch = fgetc()) != EOF; i++)

Also, you need to think about line separators, both '\n' (carriage return) and '\n' (line feed) can occur.

于 2012-08-21T14:20:50.133 に答える
0

各キャラクターの後に再割り当てする必要はないと思います。バッファを必要な最小値にしたい場合は、最後に ( strlen() + 1); で再割り当てできます。また、行を読み取る関数 fgets() があります。

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


int somefunc(FILE *grab)
{
   int current_size = 100;
   int data_size = current_size - 1;
   char *url = malloc(current_size);
   char *line = malloc(current_size);
   char *linetmp;
   int ch;
   ch = fgetc(grab);
   int i = 0;
   int c  = 0;
   while (ch  != EOF && ch != 0x0A )
   {
      i++;
      if ( i > data_size )
      {
         current_size = current_size * 2;
         data_size = current_size - 1;
         linetmp = realloc(line, current_size);
         if (!linetmp)
         {
            free(line);
            free(url);
            printf("\nError! Memory allocation failed!");
            return 1;
         }
         line = linetmp;
      }
      line[c] = ch;
      c++;
      ch = fgetc(grab);
   }
   line[c] = '\0';
   linetmp = realloc(line,strlen(line) + 1);
   line = linetmp;
   printf("we just read line->%s\n",line);
   free(line);
   free(url);
   return 0;
}


int main(void)
{
   char *cpFilename = "somefile.txt";
   FILE *fp = fopen(cpFilename,"r");
   if ( fp == NULL )
   {
      printf("ERROR: could not open %s\n",cpFilename);
      printf("Error code: %d\n",errno);
      perror("ERROR:");
      return 1;
   }
   int return_code = somefunc(fp);
   while (return_code != EOF && return_code != 1)
   {
      return_code = somefunc(fp);
   }
   fclose(fp);
}
于 2012-08-21T15:08:16.920 に答える