Déclarer une variable à partir d'un fichier

Résolu/Fermé
Maximilien LIX Messages postés 311 Date d'inscription jeudi 25 juillet 2013 Statut Membre Dernière intervention 30 octobre 2014 - Modifié par Maximilien LIX le 1/07/2014 à 02:06
Maximilien LIX Messages postés 311 Date d'inscription jeudi 25 juillet 2013 Statut Membre Dernière intervention 30 octobre 2014 - 1 juil. 2014 à 12:35
Hello world ,
je fais du scripting bash sous GNU/Linux en ce moment , mais bash n'est pas très bien adapté pour des opérations mathématiques complexes. Du coup je vais utiliser un programme en C pour faire quelques opérations.

Le principe est simple.

Le script bash génère un fichier qui contient à l'intérrieur le nombre d'octets de mon disque dur , et un deuxième fichier qui contient le nombre d'octets de mémoire vive.

Je veux lire le fichier qui contient le nombre d'octets de mon disque dur avec le programme en C. J'utilise fopen avec fgets dans une boucle while ainsi que printf pour afficher le contenu du fichier.

Question donc , comment faire pour déclarer une variable en C qui contiendra la valeur contenu dans le fichier qui contient le nombre d'octets de mon disque dur.

Voici le fichier bash:

#!/bin/bash

let "net = 0 "
info_disk='fdisk -l /dev/sda'
info_file='echo "$info_disk" > disk_file'
disk_read=' while read line
do
echo
echo -e "$line\n"
done < disk_file'
for word in $disk_read
do
let "net = net + 1"
if [ "$net" == 5 ]
then
disk_size-variable="$word"
echo "$word" > disk_size
fi
done

mem_info=$(</proc/meminfo)
mem_info=$(echo $(echo $(mem_info=${mem_info// /}; echo ${mem_info//kB/})))
for m in $mem_info; do
if [[ ${m//:*} = MemTotal ]]; then
memtotal=${m//*:}
echo "$memtotal" > ram_size
fi
done

Voici le fichier C (pour le moment)

#include<stdio.h>
#include<stdlib.h>
#define TAILLE_MAX 1000
int main()
{
int ram = 0 , disk = 0 ;
char lecture_disk_size[TAILLE_MAX]="";
FILE *file_disk_size = NULL;
file_disk_size = fopen("disk_size", "r");

if (file_disk_size != NULL)
{
while (fgets(lecture_disk_size,TAILLE_MAX,file_disk_size)!= NULL)
{
printf("%s",lecture_disk_size);
}
}
else
{
printf("FATAL ERROR SYSTEM");
}
return 0;

Voila , merci de bien vouloir m'aider ^^

(en faite j'aimerais diviser le contenu du fichier ram_size par le contenu du fichier disk_size puis multiplier le résultat par 100, Cet algorithme permettra en faite de savoir le pourcentage d'espace disque qui sera nécessaire pour la création d'une partition swap )
A voir également:

3 réponses

Utilisateur anonyme
1 juil. 2014 à 08:34
Ce qui est important est de connaître la forme du fichier contenant l'information nombre d'octets de mon disque dur...

Analyser un fichier sans en connaître les tenants et aboutissants, c'est difficile !

char lecture_disk_size[TAILLE_MAX];


suffira...

En général pour récupérer ce genre d'information, on aime bien fscanf.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
Modifié par Twinuts le 1/07/2014 à 10:37
Salut,

Ma réponse est relativement hors sujet avec la question mais, une autre piste qui vaut ce qu'elle vaut, serait de remplacer le script bash par du lua et ainsi étendre les possibilités de ton script... tout en utilisant l'API lua en C:

Petit exemple:
Le fichier C (lua_disk.c)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>

#define LUA_FILE "lua_disk.lua"
#define DEVICE "/dev/sda"

int main(int argc, char** argv) {
  int error, disk_size;

  /* init de la stack Lua */
  lua_State *ll = luaL_newstate();
  if(!ll) {
    fprintf(stderr, "Unable to create Lua state variable.\n");
    return EXIT_FAILURE;
  }

  /* Chargement des lib Lua */
  luaL_openlibs(ll);

  /* Chargement du script */
  if (luaL_loadfile(ll, LUA_FILE)) {
    fprintf(stderr, "Unable to load the Lua file.\n");
    return EXIT_FAILURE;
  }
  /* Cet appel permet le chargement des variables & co du script lua */
  if (lua_pcall(ll, 0, 0, 0)) {
    fprintf(stderr, "Unable to initialize the lua pcall: '%s'.\n", lua_tostring(ll, -1));
    return EXIT_FAILURE;
  }

  /* preparation de l'appel de la fonction getDiskSize */
  lua_getglobal(ll, "getDiskSize");
  /* passe le nom de la partition en parametre */
  lua_pushlstring(ll, DEVICE, strlen(DEVICE));
  /* appel de la fonction */
  error = lua_pcall(ll, 1, 1, 0);
  if(error) {
    fprintf(stderr, "'getDiskSize'. Error %d ('%s')\n", error, lua_tostring(ll, -1));
    return EXIT_FAILURE;
  }
  /* recuperation du retour de la fonction getDiskSize */
  /* Ici le retour est de type int */
  if (!lua_isnumber(ll, -1)) {
    fprintf(stderr, "function 'getDiskSize' must return a number\n");
    return EXIT_FAILURE;
  }
  disk_size = lua_tointeger(ll, -1);
  lua_pop(ll, 1);  /* depile la valeur retournee */

  printf("Disk size from LUA: %d\n", disk_size);

  /* close les ressources lua */
  lua_close(ll);
  return EXIT_SUCCESS;
}


Le script lua (lua_disk.lua):

-- Fonction split recuperee ici : http://snippets.luacode.org/snippets/Split_a_string_into_a_list_5
function split(s,re)
local i1 = 1
local ls = {}
local append = table.insert
if not re then re = '%s+' end
if re == '' then return {s} end
while true do
local i2,i3 = s:find(re,i1)
if not i2 then
local last = s:sub(i1)
if last ~= '' then append(ls,last) end
if #ls == 1 and ls[1] == '' then
return {}
else
return ls
end
end
append(ls,s:sub(i1,i2-1))
i1 = i3+1
end
end

---
-- Exemple de code fait avec LUA 5.2
-- Attention en LUA un tableau commence par 1 et non 0
-- En LUA >5.2 la taille d'un tableau ce calcul comme suit the_size = #my_array
function getDiskSize(device)
-- execution de la command systeme
local f = io.popen("df " .. device .. " | tail -n 1")
-- lecture de la reponse
local l = f:read("*a")
-- fermeture du pipe
f:close()
-- split de la reponse pour recuperer le champ Available
local result = split(l)
-- conversion du retour en int
return tonumber(result[4])
end


Compilation apres avoir installé les lib lua
gcc lua_disk.c -o lua_disk -llua -lm -ldl
ou
gcc -I<includes_lua> -L<libs_lua> lua_disk.c -o lua_disk -llua -lm -ldl

Dans cet exemple le script Lua est placé au meme niveau que l'exécutable 'lua_disk'





Dev addict
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
0
Maximilien LIX Messages postés 311 Date d'inscription jeudi 25 juillet 2013 Statut Membre Dernière intervention 30 octobre 2014 23
1 juil. 2014 à 12:35
Ah mais oui fscanf ! Merci ! :D

Pour le lua ça à l'air très intéressant merci du conseil :)
0