Unix - 将一行从文件写入char * var,然后将其保存为整数

时间:2017-06-04 14:19:06

标签: c multithreading file unix

问题:我有一个名为ATM1的文件,例如,它填充了字符串(这是每行的格式):O ilan 123 456这意味着 - O代表打开帐户,ilan是用户名,123是密码,456是我银行帐户中的初始金额。

打开文件后,使用while循环while(((ret_in = read (in1, &buffer1, BUF_SIZE)) > 0))进行迭代,我想获取行的详细信息并将它们存储在适当的变量中。例如,第一个字符将存储在一个名为letter或msg [0]的变量中,无论什么对您来说更方便,然后有一个空格,然后是用户名,然后是密码,以及可选的东西,如余额,或者可能是另一个帐户ID(对于转移资金用途)。

每台ATM机应该是一个线程,它有自己的文件,现在它只是一个文件" ATM1"因为我希望它至少在一个文件中起作用。

当前问题: OpenFile函数中的分段错误。我仍然无法将行的值存储在适当的变量中,并且在开立帐户等时调用了switch语句。

以下是当前代码:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>

#define BUF_SIZE  8192
sem_t log;


void OpenNewAccount(int acc,int pw,int amount){


}

struct Account{
    int  number;
    int  password;
    int  balance;
};

//*Opens file for every ATM
void* openFile(void* args){
  //To add later: while(true) { sleep(100); do next file's line }
  //Open file
  int* aargs = args;

  int acc;
  int pw;
  int amount;
  int target_acc;

  int ret_in, in1,file;
  char buffer1[BUF_SIZE];

  int count = 0;
  int i = 0;
  char fn[5] = "ATM1";

  char* msg;
 file = open(fn,O_RDONLY|O_CREAT,0644);


while(((ret_in = read (file, &buffer1, BUF_SIZE)) > 0))
  {
   for(i; i<ret_in; i++)
    {
     if(buffer1[i]!='\n')
      msg[i] = buffer1[i];
    /* else{
      if(count == 0){
       count++;
       break;
      }
      else
      {
       count = i + 1;
       break;
      }
     }
*/
    }
}
    printf("%s", msg); //TEST: check msg
    //Here we translate the message
/*
  //Here we call the relevant function of the msg  
   switch (msg[count - 1]){
   case 'O': OpenNewAccount(acc,pw,amount);
   case 'D': Deposit(acc,pw,amount);
   case 'W': Withdrawl(acc,pw,amount);
   case 'B': Balance(acc,pw);
   case 'Q': CloseAccount(acc,pw);
   case 'T': Transfer(acc,pw,target_acc,amount);

 }
*/


}

//*finish: Update log.txt and lock it
void WriteLog(char* msg){
 int file;
 char logName[8] = "log.txt";
 sem_wait(&log);
 file = open(logName,O_WRONLY|O_CREAT,0644);
 strcat(msg,"\n");
 write(file,&msg,strlen(msg));
 close(file);
 sem_post(&log);
}

int main(void)
{
int i,n,a;
sem_init(&log, 0, 1);
printf("Please enter the number of ATMs you want: \n");
scanf("%d", &n);

int bank; //bank with n ATMs
pthread_t thread[3];
printf("test\n"); //TEST: check msg
for(i = 0; i < 3; i++)
pthread_create ( &thread[i] , NULL , openFile , &i);

scanf("%d",&a);
}

1 个答案:

答案 0 :(得分:2)

嗯,首先,你使用i作为数组索引而不用初始化它。这很容易导致SEGFAULT。

但说实话,整件事情都是一团糟。您的功能名称不会按照他们的说法执行。你似乎几乎是随机地晃来晃去。我建议你从一开始就重新思考你的设计。通过&#34;自上而下&#34;你应该学习的设计过程,并弄清楚如何分解代码。只有这样才能继续。