Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <667b07d3$0$2873017$882e4bbb@reader.netnews.com>
Deutsch   English   Français   Italiano  
<667b07d3$0$2873017$882e4bbb@reader.netnews.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news-out.netnews.com!postmaster.netnews.com!us8.netnews.com!not-for-mail
X-Trace: DXC=XBiUnmD1ASm7ER^H[7h9UcHWonT5<]0TmQ;nb^V>PUff5[gZBW6J?Ll>8J_kK>kdRiI]PP9U=83Hl>bl72nREV]iMba][>SC2Cgf;]EoU=id5f=R<hY6_C9Th
X-Complaints-To: support@blocknews.net
Date: Tue, 25 Jun 2024 14:09:23 -0400
MIME-Version: 1.0
User-Agent: Betterbird (Windows)
Subject: Re: Whaddaya think?
Newsgroups: comp.lang.c
References: <666ded36$0$958$882e4bbb@reader.netnews.com>
 <v4n1nf$2fae$1@dont-email.me> <v5ev8k$1l548$1@dont-email.me>
Content-Language: en-US
From: DFS <nospam@dfs.com>
In-Reply-To: <v5ev8k$1l548$1@dont-email.me>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Lines: 156
Message-ID: <667b07d3$0$2873017$882e4bbb@reader.netnews.com>
NNTP-Posting-Host: 127.0.0.1
X-Trace: 1719338963 reader.netnews.com 2873017 127.0.0.1:40257
Bytes: 5739

On 6/25/2024 1:37 PM, Lew Pitcher wrote:
> On Sun, 16 Jun 2024 15:52:16 +0000, Lew Pitcher wrote:
> 
>> On Sat, 15 Jun 2024 15:36:22 -0400, DFS wrote:
>>
>>> I want to read numbers in from a file, say:
>>>
>>> 47 185 99 74 202 118 78 203 264 207 19 17 34 167 148 54 297 271 118 245
>>> 294 188 140 134 251 188 236 160 48 189 228 94 74 27 168 275 144 245 178
>>> 108 152 197 125 185 63 272 239 60 242 56 4 235 244 144 69 195 32 4 54 79
>>> 193 282 173 267 8 40 241 152 285 119 259 136 15 83 21 78 55 259 137 297
>>> 15 141 232 259 285 300 153 16 4 207 95 197 188 267 164 195 7 104 47 291
>>>
>>>
>>> This code:
>>> 1 opens the file
>>> 2 fscanf thru the file to count the number of data points
>>> 3 allocate memory
>>> 4 rewind and fscanf again to add the data to the int array
>>>
>>>
> [snip]
>> You /could/ create a temporary, binary, file, and write the fscanf()'ed
>> values to it as part of the first loop. Once the first loop completes,
>> you rewind this temporary file, and load your integer array by reading
>> the (now converted to native integer format) values from that file.
>>
>> Still two passes, but using fscanf() in only one of those passes.
> [snip]
> 
> For what it's worth, here's an example of what I suggest:
> 
> /*
> The following code provides two examples of the approach I suggested.
> 
> Example 1: while counting input numbers, write temp file with int values
> 	   malloc() a buffer big enough for that count of int values
> 	   fread() the temp file into the malloc()'ed buffer
> 	   Note: conformant to ISO Standard C.
> 
> Example 2: while counting input numbers, write temp file with int values
> 	   mmap() the temp file, starting at the beginning, and sized to
> 	   include all the int values in the file.
> 	   Note: conformant to POSIX C extensions to ISO Standard C.
> 
> Note: compile with -DUSE_MMAP to obtain mmap() variant, otherwise
>        this will compile the malloc()/fread() variant
> */
> 
> #include <stdio.h>
> #include <stdlib.h>
> 
> #ifdef USE_MMAP
>    #include <sys/mman.h>
>    #define BANNER	"Example of array loading using mmap()"
>    #define FREEALLOC(x)
> #else
>    #define BANNER	"Example of array loading using malloc() and fread()"
>    #define FREEALLOC(x) free((x))
> #endif
> 
> static int *LoadIntArray(FILE *fp, size_t *Count);
> 
> int main(void)
> {
>    int status = EXIT_FAILURE, *array;
>    size_t count;
> 
>    puts(BANNER);
> 
>    if ((array = LoadIntArray(stdin,&count)))
>    {
>      printf("%zu elements loaded\n",count);
>      for (size_t index = 0; index < count; ++index)
>        printf("array[%3zu] == %d\n",index,array[index]);
> 
>      FREEALLOC(array);	/* if necessary, free() the malloc()'ed array */
>      status = EXIT_SUCCESS;
>    }
>    return status;
> }
> 
> static int *LoadIntArray(FILE *fp,size_t *Count)
> {
>    FILE *tmp;
>    int *array = NULL;
>    size_t count = 0;
> 
>    if ((tmp = tmpfile()))
>    {
>      int buffer;
> 
>      for (count = 0; fscanf(fp,"%d",&buffer) == 1; ++count)
>        fwrite(&buffer,sizeof buffer, 1,tmp);
> 
>      if (count)
>      {
> #ifdef USE_MMAP
>        /*
>        ** USE mmap() to map temp_file data into process memory
>        */
>        array = mmap(NULL,
>                     count * sizeof *array,
>                     PROT_READ,MAP_PRIVATE,
>                     fileno(tmp),
>                     0);
>        if (array == MAP_FAILED)
>        {
> 	array = NULL;
> 	fprintf(stderr,"FAIL: Cannot mmap %zu element array\n",count);
>        }
> #else
>        /*
>        ** USE malloc() to reserve a big enough heap-space buffer,
>        ** then fread() the temp_file data into that buffer
>        */
>        if ((array = malloc(count * sizeof *array)))
>        {
> 	rewind(tmp);
> 	if (fread(array,sizeof *array,count,tmp) != count)
> 	{
> 	  free(array);
> 	  array = NULL;
> 	  fprintf(stderr,"FAIL: Cannot load %zu element array\n",count);
> 	}
>        }
>        else fprintf(stderr,"FAIL: Cant malloc() %zu element array\n",count);
> #endif
>      }
>      fclose(tmp);
> 
>    }
>    else fprintf(stderr,"FAIL: Cannot allocate temporary work file\n");
> 
>    *Count = count;	/* byproduct value that caller might find useful */
>    return array;		/* either NULL (on failure) or pointer to array */
> }
> 

$ gcc -Wall LewPitcher_readnums.c -o lprn
$ (no compile errors)
$ ./lprn nums.txt
Example of array loading using malloc() and fread()

(then it just hung)


$ gcc -Wall LewPitcher_readnums.c -o lprn -DUSE_MMAP
$ (no compile errors)
$ ./lprn nums.txt
Example of array loading using mmap()

(then it just hung)


Am I supposed to hardcode the filename in there somewhere?