问题:我有一个名为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);
}
答案 0 :(得分:2)
嗯,首先,你使用i作为数组索引而不用初始化它。这很容易导致SEGFAULT。
但说实话,整件事情都是一团糟。您的功能名称不会按照他们的说法执行。你似乎几乎是随机地晃来晃去。我建议你从一开始就重新思考你的设计。通过&#34;自上而下&#34;你应该学习的设计过程,并弄清楚如何分解代码。只有这样才能继续。