[英]Compare multiple chars without using string compare functions
I am trying to create a switch statement using the parameters that can be passed into my File classes constructor in the mode
parameter.我正在尝试使用可以在
mode
参数中传递给我的 File 类构造函数的参数创建一个 switch 语句。 However, as mode can be up to 2 chars ('r', 'r+', 'w', or 'w+'), I do not know how to create a switch statement that will get this done for me.但是,由于模式最多可以包含 2 个字符('r'、'r+'、'w' 或 'w+'),我不知道如何创建一个 switch 语句来为我完成这项工作。
Does anyone have any suggestions on how to implement this?有没有人对如何实现这一点有任何建议? Currently with what I have below, I am getting errors for the 'r+' and 'w+' cases, as those are not chars.
目前,我在下面的内容中遇到了 'r+' 和 'w+' 情况的错误,因为它们不是字符。
File::File(const char *name, const char *mode) {
int fileMode = 0; //Initializing mode to 0
fileName = name; //Setting the file name of this File object to the name we pass in.
switch(*mode){
case 'r':
fileMode = O_RDONLY | O_CREAT;
canWeRead = true;
canWeWrite = false;
break;
// Open a text file for update (that is, for both reading and writing)
case 'r+':
fileMode = O_RDWR | O_CREAT;
canWeRead = true;
canWeWrite = true;
break;
case 'w':
fileMode = O_WRONLY | O_CREAT;
canWeRead = false;
canWeWrite = true;
break;
// Open a text file for update (reading and writing),
// first truncating the file to zero length if it exists
// or creating the file if it does not exist.
case 'w+':
fileMode = O_RDWR | O_CREAT | O_TRUNC;
canWeRead = true;
canWeWrite = true;
break;
default: //We should never reach the default case, so I assert(0)
assert(0);
}
fileBuffer = (char*)malloc(bufsiz); //Create buffer with malloc
//Free is called in the File class destructor.
assert(fileBuffer != NULL); //If fileBuffer == NULL, we did not allocate a buffer.
fileDescriptor = open(name, fileMode);
/*On success, open() returns the new file descriptor (a nonnegative integer).
On error, -1 is returned and errno is set to indicate the error.*/
assert(fileDescriptor >= 0); //If we dont get a positive nonnegative int, we have a problem.
}
File::~File() {
free(fileBuffer); //Free the memory we have for the buffer
int rc = close(this->fileDescriptor); //We want to close the FileDescriptor of the current File object.
assert(rc == 0); //close returns 0 on success. So if we dont get 0, we have a problem.
}
You can't use more than one value in case.您不能使用多个值以防万一。
1 - You can use more than one switch: 1 - 您可以使用多个开关:
switch(mode[0]){
case 'r':
switch(mode[1]){
case '+':
switch(mode[2]){
case 0:
fileMode = O_RDWR | O_CREAT;
canWeRead = true;
canWeWrite = true;
break;
default:
assert(0);
}
case 0:
fileMode = O_RDONLY | O_CREAT;
canWeRead = true;
canWeWrite = false;
break;
}
break;
case 'w':
switch(mode[1]){
case '+':
switch(mode[2]){
case 0:
fileMode = O_RDWR | O_CREAT | O_TRUNC;
canWeRead = true;
canWeWrite = true;
break;
default:
assert(0);
}
case 0:
fileMode = O_WRONLY | O_CREAT;
canWeRead = false;
canWeWrite = true;
break;
}
break;
default:
assert(0);
}
2 - You can make mode
's type char[4] and have ugly function call. 2 - 您可以制作
mode
的类型 char[4] 并进行丑陋的 function 调用。 Like File("filename", {'r', '+'})
(this way can be affected by endian difference)像
File("filename", {'r', '+'})
(这种方式会受到字节序差异的影响)
switch(*(uint32_t *)mode){
// r
case 0x72000000:
fileMode = O_RDONLY | O_CREAT;
canWeRead = true;
canWeWrite = false;
break;
// r+
case 0x722b0000:
fileMode = O_RDWR | O_CREAT;
canWeRead = true;
canWeWrite = true;
break;
// w
case 0x77000000:
fileMode = O_WRONLY | O_CREAT;
canWeRead = false;
canWeWrite = true;
break;
// w+
case 0x772b0000:
fileMode = O_RDWR | O_CREAT | O_TRUNC;
canWeRead = true;
canWeWrite = true;
break;
default:
assert(0);
}
Anyway that ways are just too much overkill for simple thing.无论如何,这些方法对于简单的事情来说太过分了。 System calls would eat more than thousands of more time than string compare.
系统调用会比字符串比较多消耗数千倍的时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.