473,320 Members | 2,073 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

something fishy here with stripnl()

i am writing a prog that reads mulitple lines from a txt file in
succession into code that takes these lines as an input file that would
be opened and from which data would be manipulated. As the in the
following:

#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 150
#define PI 3.14159265

void stripnl(char *str) {
while(strlen(str) && ( (str[strlen(str) - 1] == 13) ||
( str[strlen(str) - 1] == 10 ))) {
str[strlen(str) - 1] = 0;
}

}

int main() {
char fname[40];
char line[20];
double x[MAX],y[MAX];
double mm,mxy,my,mx,mx2;
double resul;
double a[2][2],b[2][2],c[2][2];
double w;
int q,counter,v,lcount;
int ifail;
int m,n,k;
FILE *input,*result,*infile;

// Read in the filename //
printf("Enter the name of data file: ");
fgets(fname, sizeof(fname), stdin);

// get rid of the newline char //
stripnl(fname);
strtok(fname," ");

// Open the file//
if((infile = fopen(fname, "rt")) == NULL) {
printf("Error Opening File.\n");
exit(1);
}
while( fgets(line, sizeof(line), infile) != NULL ) {
// Get each line from the infile //
lcount++;
// print the line number and data //
printf("Line %d: %s",lcount,line);
printf("%s",line);

<><>><><><><><><><><><><><><><><><><><>

if ((input = fopen(line,"rt")) == NULL )
{
printf("\ndata file not found\n\n");
exit(0);
}
<><><><><><><><><><><><><><><><><><><><><><

counter=0;
while(!feof(input))
{
if(counter==MAX-1)
{
printf("\n too many points ,taking the first %d points
\n",counter); break;
}
counter++;
fscanf(input,"%lf %lf\n",&x[counter],&y[counter]);
printf("%lf %lf\n",&x[counter],&y[counter]);
}
v=counter;
result=fopen("st_line.dat","w");
for(q=1,mm=0,mx=0,mxy=0,my=0,mx2=0;q<=v;q++)
{
//summing values and naming as variable//
{
resul=cos(x[q]*PI/180);
printf(" %lf %lf \n",resul,x[q]);
}
mm=q;
mxy=mxy+resul*y[q];
my=my+y[q];
mx=mx+resul;
mx2=mx2+resul*resul;
}
a[0][0]= mm;
a[0][1]= mx;
a[1][0]= mx;
a[1][1]= mx2;

b[0][0]=my;
b[1][0]=mxy;
b[0][1]=0;
b[1][1]=0;

printf("\n\n %lf %lf \n %lf %lf
\n",a[0][0],a[0][1],a[1][0],a[1][1]);
printf("\n\n %lf %lf \n %lf %lf
\n",b[0][0],b[0][1],b[1][0],b[1][1]);

printf("\n\n %lf %lf \n %lf %lf
\n\n",a[0][0],a[0][1],a[1][0],a[1][1]);

fclose(input);
fclose(result);
}

#undef MAX
fclose(infile);
}

---------------------------------------------------------------------------------

When it gets to the "if" statement between the "<><><><><><" i receive
the "data file not found", but yet in the fopen line that contains
"fname" works perfectly if the "stripnl()" line is present. This is my
first time working with char strings in this fasion and i am not
familiar with the procedures. i assumed that it is because fopen does
not know where the end of the string is and is getting confused, and if
that is the case, then i am not versed well enough in C to tell it
otherwise.

Aug 3 '06 #1
17 2717
"grinder" <tp**@pitt.eduwrites:
void stripnl(char *str) {
while(strlen(str) && ( (str[strlen(str) - 1] == 13) ||
( str[strlen(str) - 1] == 10 ))) {
str[strlen(str) - 1] = 0;
}

}
You should use '\r' and '\n' in place of 13 and 10. In fact, the
'\r' should not be necessary, because you're reading a text
stream, and lines in text streams end in just a new-line ('\n').

The name of the function should not be stripnl, because names
that begin with str followed by a letter are reserved.

It's likely to be really inefficient to call strlen so many
times. You should only need to call it once per function
invocation.

The excessive use of parentheses above makes it hard to actual
read out the operator precedence. I'd suggest dropping the
parentheses around the equality expressions as a start.

I'm not sure what the real problem is, because I only read that
much of your code, but those should get you started.
--
"Give me a couple of years and a large research grant,
and I'll give you a receipt." --Richard Heathfield
Aug 3 '06 #2
Ben Pfaff wrote:
"grinder" <tp**@pitt.eduwrites:
>void stripnl(char *str) {
while(strlen(str) && ( (str[strlen(str) - 1] == 13) ||
( str[strlen(str) - 1] == 10 ))) {
str[strlen(str) - 1] = 0;
}

}

You should use '\r' and '\n' in place of 13 and 10. In fact, the
'\r' should not be necessary, because you're reading a text
stream, and lines in text streams end in just a new-line ('\n').
In the real world, one does often encounter MS-DOS text files on Unix or
Unix-like (eg. Cygwin) systems. Text streams there will not strip out
the '\r' for you.

In many cases it's good practise to write code that will work properly
whether it encounters Unix ("\n"), Mac ("\r") or MS-DOS ("\r\n") text
files, or even a mixture within one file.

--
Simon.
Aug 4 '06 #3
"grinder" <tp**@pitt.eduwrites:
i am writing a prog that reads mulitple lines from a txt file in
succession into code that takes these lines as an input file that would
be opened and from which data would be manipulated. As the in the
following:

#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 150
#define PI 3.14159265

void stripnl(char *str) {
while(strlen(str) && ( (str[strlen(str) - 1] == 13) ||
( str[strlen(str) - 1] == 10 ))) {
str[strlen(str) - 1] = 0;
}
Possibly inefficient. Something like this is probably quicker and easier
to read/debug. Not tested - you get the idea. Youre assuming the
possibility of multiple blank lines I guess?

size_t l = strlen(str);
while(l && (str[l-1]=='\n'))
str[l--] = '\0';
As for the rest : did you use a debugger/printf to examine the "line" variable?
Does it have \n on the end? Does it work if you call stripnl?

More importantly, are you sure the files its trying to open are there? :-;

Good luck!

>
}

int main() {
char fname[40];
char line[20];
double x[MAX],y[MAX];
double mm,mxy,my,mx,mx2;
double resul;
double a[2][2],b[2][2],c[2][2];
double w;
int q,counter,v,lcount;
int ifail;
int m,n,k;
FILE *input,*result,*infile;

// Read in the filename //
printf("Enter the name of data file: ");
fgets(fname, sizeof(fname), stdin);

// get rid of the newline char //
stripnl(fname);
strtok(fname," ");

// Open the file//
if((infile = fopen(fname, "rt")) == NULL) {
printf("Error Opening File.\n");
exit(1);
}
while( fgets(line, sizeof(line), infile) != NULL ) {
// Get each line from the infile //
lcount++;
// print the line number and data //
printf("Line %d: %s",lcount,line);
printf("%s",line);

<><>><><><><><><><><><><><><><><><><><>

if ((input = fopen(line,"rt")) == NULL )
{
printf("\ndata file not found\n\n");
exit(0);
}
<><><><><><><><><><><><><><><><><><><><><><

counter=0;
while(!feof(input))
{
if(counter==MAX-1)
{
printf("\n too many points ,taking the first %d points
\n",counter); break;
}
counter++;
fscanf(input,"%lf %lf\n",&x[counter],&y[counter]);
printf("%lf %lf\n",&x[counter],&y[counter]);
}
v=counter;
result=fopen("st_line.dat","w");
for(q=1,mm=0,mx=0,mxy=0,my=0,mx2=0;q<=v;q++)
{
//summing values and naming as variable//
{
resul=cos(x[q]*PI/180);
printf(" %lf %lf \n",resul,x[q]);
}
mm=q;
mxy=mxy+resul*y[q];
my=my+y[q];
mx=mx+resul;
mx2=mx2+resul*resul;
}
a[0][0]= mm;
a[0][1]= mx;
a[1][0]= mx;
a[1][1]= mx2;

b[0][0]=my;
b[1][0]=mxy;
b[0][1]=0;
b[1][1]=0;

printf("\n\n %lf %lf \n %lf %lf
\n",a[0][0],a[0][1],a[1][0],a[1][1]);
printf("\n\n %lf %lf \n %lf %lf
\n",b[0][0],b[0][1],b[1][0],b[1][1]);

printf("\n\n %lf %lf \n %lf %lf
\n\n",a[0][0],a[0][1],a[1][0],a[1][1]);

fclose(input);
fclose(result);
}

#undef MAX
fclose(infile);
}

---------------------------------------------------------------------------------

When it gets to the "if" statement between the "<><><><><><" i receive
the "data file not found", but yet in the fopen line that contains
"fname" works perfectly if the "stripnl()" line is present. This is my
first time working with char strings in this fasion and i am not
familiar with the procedures. i assumed that it is because fopen does
not know where the end of the string is and is getting confused, and if
that is the case, then i am not versed well enough in C to tell it
otherwise.
Aug 4 '06 #4
"Simon Biber" <ne**@ralmin.ccwrote in message
news:44********@news.peopletelecom.com.au...
In the real world, one does often encounter MS-DOS text files on Unix or
Unix-like (eg. Cygwin) systems. Text streams there will not strip out
the '\r' for you.

In many cases it's good practise to write code that will work properly
whether it encounters Unix ("\n"), Mac ("\r") or MS-DOS ("\r\n") text
files, or even a mixture within one file.
Uhm, don't the C library functions do all that for you? In text-mode output
to streams, '\n' is converted to the local newline expression, whatever that
may be. This doesn't necessarily apply if you are using
implementation-specific I/O calls.

Philip

Aug 4 '06 #5
>
When it gets to the "if" statement between the "<><><><><><" i receive
the "data file not found", but yet in the fopen line that contains
"fname" works perfectly if the "stripnl()" line is present.
?? That comment makes no sense to me. There's an "exit()" after the
error message, so you can't have seen the code work after getting the
error message.
This is my
first time working with char strings in this fasion and i am not
familiar with the procedures. i assumed that it is because fopen does
not know where the end of the string is and is getting confused, and if
that is the case, then i am not versed well enough in C to tell it
otherwise.
So what is the problem? If the code is working, what would you like it
to do differently?

A few general suggestions:

Don't use a file name array of length 20! File names can be a whole
lot longer, especially if paths are involved. Memory is cheap these
days, go for at least 500.

The man page for gets() says it DOES NOT return the \n character at the
end, unlike fgets() which DOES, so the mystery deepens.

How about you print out the line in ascii and decimal so we can see
exactly what is there?:

for( i=0; i <strlen(line);i++ ) printf( "Char %3d is '%c' '%3d'\n",
i+1, line[i], line[i] );

Also, why are you doing a strtok() on the file name? strtok is a bit
dangerous as it modifies the input string, which often leads to major
confusion.

You may not have a problem at all if you take out the trimming code and
the strtok().

Aug 4 '06 #6
"Philip Potter" <ph***********@xilinx.comwrote in message
news:ea*********@cliff.xsj.xilinx.com...
"Simon Biber" <ne**@ralmin.ccwrote in message
news:44********@news.peopletelecom.com.au...
Text streams there will not strip out
the '\r' for you.
Uhm, don't the C library functions do all that for you? In text-mode
output
to streams, '\n' is converted to the local newline expression, whatever
that
may be.
*slaps forehead*
I will read posts before replying.
I will read posts before replying.
I will read posts before replying.

Philip

Aug 4 '06 #7
grinder wrote:
....
#include<stdlib.h>
....
void stripnl(char *str) {
It's a relatively minor point, but since no one else has mentioned it:
the external symbol stripnl() is in the namespace reserved to the
implemention when <stdlib.hor <string.his included. While it's
unlikely to actually conflict, you should consider changing the name to
not start with "str".

Philip Guenther

Aug 4 '06 #8
"Philip Guenther" <gu******@gmail.comwrites:
grinder wrote:
...
>#include<stdlib.h>
...
>void stripnl(char *str) {

It's a relatively minor point, but since no one else has mentioned it:
the external symbol stripnl() is in the namespace reserved to the
implemention when <stdlib.hor <string.his included. While it's
unlikely to actually conflict, you should consider changing the name to
not start with "str".
Only identifiers starting with "str" and a lowercase letter are
reserved. "str_ipnl" would be ok.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Aug 4 '06 #9
Philip Guenther wrote:
grinder wrote:
....
>#include<stdlib.h>
....
>void stripnl(char *str) {

It's a relatively minor point, but since no one else has mentioned it:
the external symbol stripnl() is in the namespace reserved to the
implemention when <stdlib.hor <string.his included. While it's
unlikely to actually conflict, you should consider changing the name to
not start with "str".
It's not true that no-one else mentioned it. The very first reply by Ben
Pfaff mentioned it:

Ben Pfaff wrote:
The name of the function should not be stripnl, because names
that begin with str followed by a letter are reserved.
--
Simon.
Aug 4 '06 #10
i have tried some of the suggestions, but yet to no avail. so i have
taken the advice of ancient_hacker and have supplied the output below:

<><><><><><><><><><><><><><><><><><><><><><><>
Enter the name of data file: lin_file.dat
Line 1: points.dat
points.dat
Char 1 is 'p' '112'
Char 2 is 'o' '111'
Char 3 is 'i' '105'
Char 4 is 'n' '110'
Char 5 is 't' '116'
Char 6 is 's' '115'
Char 7 is '.' ' 46'
Char 8 is 'd' '100'
Char 9 is 'a' ' 97'
Char 10 is 't' '116'
Char 11 is '
' ' 10'

data file not found

Segmentation fault

<><><><><>><><><><><><><><><><><><><><
i have removed the "exit()" and the "strtok()" and still get this
output. Also, i am positive that the file is there because i have used
it in other facets of the larger code, and every time i
ls -a it is in the directory. Though, it does seem that there is a
space after the 't',i.e., a blank for char 11.

Aug 4 '06 #11
p.s. have also changed stripnl() =stipnl(), soooooo..............

Aug 4 '06 #12

grinder wrote:
i have tried some of the suggestions, but yet to no avail. so i have
taken the advice of ancient_hacker and have supplied the output below:

<><><><><><><><><><><><><><><><><><><><><><><>
Enter the name of data file: lin_file.dat
Line 1: points.dat
points.dat
Char 1 is 'p' '112'
Char 2 is 'o' '111'
Char 3 is 'i' '105'
Char 4 is 'n' '110'
Char 5 is 't' '116'
Char 6 is 's' '115'
Char 7 is '.' ' 46'
Char 8 is 'd' '100'
Char 9 is 'a' ' 97'
Char 10 is 't' '116'
Char 11 is '
' ' 10'

data file not found

Segmentation fault

<><><><><>><><><><><><><><><><><><><><
okay, all is clear now. you are using fgets() to read from the
keybaord, which DOES pass thru the ending "\n". The numeric value of
\n is 10. You need to strip off that last character. The easiest way
is to just do a:

len = strlen( Line );

if( len 0 ) Line[ len - 1 ] = '\0';

That will zap the \n and then the file name should be acceptable to
fopen().

Aug 4 '06 #13
"grinder" <tp**@pitt.eduwrites:
i have tried some of the suggestions, but yet to no avail. so i have
taken the advice of ancient_hacker and have supplied the output below:

<><><><><><><><><><><><><><><><><><><><><><><>
Enter the name of data file: lin_file.dat
Line 1: points.dat
points.dat
Char 1 is 'p' '112'
Char 2 is 'o' '111'
Char 3 is 'i' '105'
Char 4 is 'n' '110'
Char 5 is 't' '116'
Char 6 is 's' '115'
Char 7 is '.' ' 46'
Char 8 is 'd' '100'
Char 9 is 'a' ' 97'
Char 10 is 't' '116'
Char 11 is '
' ' 10'

data file not found

Segmentation fault

<><><><><>><><><><><><><><><><><><><><
i have removed the "exit()" and the "strtok()" and still get this
output. Also, i am positive that the file is there because i have used
it in other facets of the larger code, and every time i
ls -a it is in the directory. Though, it does seem that there is a
space after the 't',i.e., a blank for char 11.
If you're on an ASCII-based system, a blank is not character 10, it's
character 32. Character 10 is an ASCII LF, also known (in most
implementations) as '\n'.

Figure out why you have a '\n' character in your string. Does the
actual file name have a '\n'? If not, figure out how to get rid of
the '\n' character.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Aug 4 '06 #14
"Ancient_Hacker" <gr**@comcast.netwrites:
grinder wrote:
>i have tried some of the suggestions, but yet to no avail. so i have
taken the advice of ancient_hacker and have supplied the output below:

<><><><><><><><><><><><><><><><><><><><><><><>
Enter the name of data file: lin_file.dat
Line 1: points.dat
points.dat
Char 1 is 'p' '112'
Char 2 is 'o' '111'
Char 3 is 'i' '105'
Char 4 is 'n' '110'
Char 5 is 't' '116'
Char 6 is 's' '115'
Char 7 is '.' ' 46'
Char 8 is 'd' '100'
Char 9 is 'a' ' 97'
Char 10 is 't' '116'
Char 11 is '
' ' 10'

data file not found

Segmentation fault

<><><><><>><><><><><><><><><><><><><><

okay, all is clear now. you are using fgets() to read from the
keybaord, which DOES pass thru the ending "\n". The numeric value of
\n is 10. You need to strip off that last character. The easiest way
is to just do a:

len = strlen( Line );

if( len 0 ) Line[ len - 1 ] = '\0';

That will zap the \n and then the file name should be acceptable to
fopen().
I'd first confirm that the character really is a '\n':

if (len 0 && Line[len-1] == '\n') {
Line[len-1] = '\0';
}

fgets() can give you a string with no trailing newline if the input
line is longer than the buffer you provided. (But in that case, you
probably don't want to use the partial line as a file name anyway; it
might make more sense to print an error message instead.)

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Aug 4 '06 #15
Keith Thompson <ks***@mib.orgwrites:
"Philip Guenther" <gu******@gmail.comwrites:
>grinder wrote:
...
>>#include<stdlib.h>
...
>>void stripnl(char *str) {

It's a relatively minor point, but since no one else has mentioned it:
the external symbol stripnl() is in the namespace reserved to the
implemention when <stdlib.hor <string.his included. While it's
unlikely to actually conflict, you should consider changing the name to
not start with "str".

Only identifiers starting with "str" and a lowercase letter are
reserved. "str_ipnl" would be ok.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Without trying it, do compilers warn about things like that?
Aug 5 '06 #16
Richard wrote:
Keith Thompson <ks***@mib.orgwrites:

>>"Philip Guenther" <gu******@gmail.comwrites:
>>>grinder wrote:
...

#include<stdlib.h>

...

void stripnl(char *str) {

It's a relatively minor point, but since no one else has mentioned it:
the external symbol stripnl() is in the namespace reserved to the
implemention when <stdlib.hor <string.his included. While it's
unlikely to actually conflict, you should consider changing the name to
not start with "str".

Only identifiers starting with "str" and a lowercase letter are
reserved. "str_ipnl" would be ok.

Without trying it, do compilers warn about things like that?
Not until a clashing name is added to one of your implementation's
standard headers or libraries.

--
Ian Collins.
Aug 5 '06 #17
Richard <rg****@gmail.comwrites:
Keith Thompson <ks***@mib.orgwrites:
>"Philip Guenther" <gu******@gmail.comwrites:
>>grinder wrote:
...
#include<stdlib.h>
...
void stripnl(char *str) {

It's a relatively minor point, but since no one else has mentioned it:
the external symbol stripnl() is in the namespace reserved to the
implemention when <stdlib.hor <string.his included. While it's
unlikely to actually conflict, you should consider changing the name to
not start with "str".

Only identifiers starting with "str" and a lowercase letter are
reserved. "str_ipnl" would be ok.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.

Without trying it, do compilers warn about things like that?
In my experience, typically not. It would be nice if they did. Of
course, this would require the compiler to recognize whether the code
it's compiling is user code or implementation code; any method for
determining this would have to be implementation-specific.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Aug 5 '06 #18

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Martin Lucas-Smith | last post by:
I am trying to take a string and split it into a filename and a number where the number is what follows the *last* instance of a comma in that string. Split and explode won't work because if the...
8
by: Sam Sungshik Kong | last post by:
Hello! I use Python for ASP programming. I found something weird. Response.Write(Request("something")) It draws "None" when there's no value for something. Actually I expect "" instead of...
7
by: Zero | last post by:
If we have a structure like: struct something{ int *a; int b; }; We allocate mempry for a using malloc or calloc. The question is when we want to know the size of the structure,...
5
by: SStory | last post by:
Hi all, I really needed to get the icons associated with each file that I want to show in a listview. I used the follow modified code sniplets found on the internet. I have left in...
44
by: Tolga | last post by:
As far as I know, Perl is known as "there are many ways to do something" and Python is known as "there is only one way". Could you please explain this? How is this possible and is it *really* a...
5
by: Daniel Vukadinovic | last post by:
Can anyone explain me these things in C++? 1.What is :: used for like in the next case: if(.... { ... ::one;
7
by: cj | last post by:
I'm sure it's simple but it's new to me I can dim x as new something which defines x as a new instance of something in one statement. I can also dim x as something then later make x = new...
9
by: squishy | last post by:
So what new suprises are in store for us with Orcas? I am downloading the VPC now to try it out myself. But, I will go out on a very sturdy limb here and say that MS will try and get developers...
5
Hunderpanzer
by: Hunderpanzer | last post by:
Okay I'm using Bloodshed Dev C++ 4.9.9.2 and something odd has been happening. I've been following book examples, and usually after it shows the entire code for a program, it gives an exercise to...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
0
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.