C programming – run time tasks

Езикът C винаги може да помогне в критични моменти. Той е парен чук! Трябваше ми просто, малко по размер и прецизно по време приложение за Windows. За да се свързвам с Arduino контролер. Мислих, мислих и се върнах към C. Башка, че Arduino също е почти C, макар и да е повече Processing. Поствам програмка, която прави нещо на всеки 5 секунди.

#include <stdio.h>
#include <windows.h>
#include <time.h>

#define interval 5

int do_something(char *i);

int main()
{
    // main
    int h, m, s, once;
    char str[100];
    time_t now;
    struct tm *tm;

    while (1)
    {
        now = time(0);
        tm = localtime (&now);

        h = tm->tm_hour;
        m = tm->tm_min;
        s = tm->tm_sec;

        if (!(s % interval) && once != 1 ){
            sprintf(str, "Time: %d:%d:%d\n", h, m, s);
            do_something(str);
            once = 1;
        } else if (!(s % interval) && once == 1 ) {
            continue;
        } else {
            once = 2;
        }

        Sleep(990);
    }

    return 0;
}

int do_something(char *i){
  printf(i);
}

Source file: time_tasks.c

За програматор използвах Tiny C.
Кратко видео по темата:

Share and Enjoy !

Shares

C read text file line by line

Код, който чете от текстов файл ред по ред:

#include <stdio.h>
int main ( void ){
	static const char filename[] = "file.txt";
	FILE *file = fopen ( filename, "r" );
 
	if ( file != NULL )	{
		char line [ 128 ]; /* maximum line size */
		while ( fgets ( line, sizeof line, file ) != NULL ) { /* read a line */
			fputs ( line, stdout ); /* write the line */
		}
		fclose ( file );
	} else {
		perror ( filename ); /* why didn't the file open? */
	}
	return 0;
}

Share and Enjoy !

Shares




C external command output – popen (_popen)

C external command output – popen (_popen)

Прилагам два кода на C, които прихващат резултат от изпълнение на конзолна програма и ред по ред го принтират към стандартния изход:

#include <stdio.h>
#include <stdlib.h>
 
int main( void ){
 
   char   psBuffer[128];
   FILE   *pPipe;
 
   if( (pPipe = _popen( "ping 10.317.112.201", "rt" )) == NULL )
      exit( 1 );
 
   while(fgets(psBuffer, 128, pPipe)) {
      if(strstr(psBuffer,"TTL")) printf("Ima ping\n");
      printf(psBuffer);
   }
 
 
   /* Close pipe and print return value of pPipe. */
   if (feof( pPipe)) {
     printf( "\nProcess returned %d\n", _pclose( pPipe ) );
   }
   else {
     printf( "Error: Failed to read the pipe to the end.\n");
   }
}
#include <stdio.h>
#include <stdlib.h>
 
 
int main( int argc, char *argv[] ){
  FILE *fp;
  int status;
  char path[1035];
 
  /* Open the command for reading. */
  fp = popen("dir ..", "r"); // Dir one directory Up
  if (fp == NULL) {
    printf("Failed to run command\n" );
    exit;
  }
 
  /* Read the output a line at a time - output it. */
  while (fgets(path, sizeof(path)-1, fp) != NULL) {
    if(strstr(path,"Edit")){    // check file/dir name contains 'Edit'
        printf("%s", path);
    }
  }
 
  /* close */
  pclose(fp);
 
  return 0;
}

И в двата кода използвам функцията strstr(), която проверява, дали върнатия стринг съдържа определен текст.

Share and Enjoy !

Shares




C string array and pointers

Няколко примера, които описват почти едно и също нещо – обхождане на елементи на масив с пойнтери. Много важно е да се схване, че масивите от стрингове всъщност представляват масиви от пойнтери от тип char!!!!
Костваше ми много време, докато се убедя, че е така, но не всеки може лесно да свикне да мисли на C :).
Пример 1

#include <stdio.h>
int main(){
 char words[][18] = {"edno", "dve", "tri", "chetiri", "pet"};
 int i;
 
 for (i = 0; i < 5; i++){
     char *words_ptr = *(words + i);
     printf("words_ptr + %d = %s \n", i, words_ptr);
 }
 return 0;
}

Пример 2

#include <stdio.h>
char words[][18] = {"edno", "dve", "tri", "chetiri", "pet"};
char *ptr;
 
int main(){
 int i;
 
 for (i = 0; i < 5; i++) {
     printf("--%s--\n",words + i);
     ptr = *(words + i);
     printf("ptr + %d = %s \n", i, ptr);
 }
 return 0;
}

Пример 3

#include <stdio.h>
char *words[] = {"edno", "dve", "tri", "chetiri", "pet"};
 
int main(){
 int i;
 
 for (i = 0; i < 5; i++) {
     printf("ptr + %d = %s \n", i, *(words + i));
 }
 return 0;
}

Share and Enjoy !

Shares




C read word line from text file

C read word from file
Прост C код, който чете от текстов файл line-by-line и показва резултата като думи. Идеята е, ако имаме файл, на който всеки ред представлява дума, да можем да вземем тази дума и да я обработим.

#include <stdio.h>
#include <stdlib.h> // ANSI C exit() prototype
 
#define MAX 40
 
int main(){
	FILE * fp;
	char words[MAX];
 
	if ((fp = fopen("in.list", "r")) == NULL){
		printf("Can't open file\n");
		exit(1);
	}
 
	while (fscanf(fp,"%s",words) == 1){
		puts(words);
	}
 
	if (fclose(fp) != 0) printf("Error in closing file \n");
}

Текстовия файл in.list съдържа следните редове:
foo
bar
biz

Естествено изхода от по-горната програма е същия.
Програмаката е много удобна, ако искаме да направим нещо като речник, който да обработваме с регулярни изрази или нещо подобно.

Share and Enjoy !

Shares