如何从 C 中的 TXT 文件中删除隐藏的换行符?
How to remove hidden line breaks from TXT file in C?
我试图从 TXT 文件中获取每一行,然后将该行传递给变量,我将在 if 语句中匹配这些变量。我的 txt 文件是:
add $t0, $t1, $t2
addi $t0, $t1, 30352
它正确地删除了逗号并将“add”、“$t0”、“$t1”、“$t2”发送到它们各自的变量,然后使用 if 语句将它们转换为二进制表示。它适用于除 $t2 之外的每个变量,因为存在某种隐藏的换行符,我一生都无法弄清楚如何删除。我的 if 语句看起来像
else if(strcmp("$t2", reg) == 0)
{
return r10;
}
应该返回 01010 但永远不会计算为真。
如何清除 C 中的换行符?
更新:这是我阅读文件的方式
FILE *fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
void sendLine()
{
//Open file, check it's not empty
fp = fopen("mymipsfile.txt", "r");
if (fp == NULL)
{
exit(EXIT_FAILURE);
}
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu:\n", read);
printf("%s", line);
remove_all_chars(line, ',');
interpertLine(line);
decodeLine(0);
printf("\n");
}
fclose(fp);
if (line)
{
free(line);
}
exit(EXIT_SUCCESS);
}
这是我如何将它拆分成变量
void interpertLine(char currentLine[])
{
//Extract the first token
char * token = strtok(currentLine, " ");
op = token;
//Loop through the string to extract all other tokens
int i = 0;
while( token != NULL ) {
//printf( " %s\n", token ); //printing each token
token = strtok(NULL, " ");
if(i == 0)
{
rs = token;
}
else if (i == 1)
{
rt = token;
}
else if (i == 2)
{
rd = token;
}
i++;
}
}
简单地将比较长度限制为可见字符:
else if (strncmp("$t2", reg, sizeof("$t2") - 1) == 0)
{
return r10;
}
注意 1:我使用 'sizeof() - 1' 来防止比较尾随的空终止字节 (0),存在于每个字符串文字“....”的末尾“....”
注意 2:如果 'reg' 指向任何以“$t2”开头的字符串,例如:“$t20”、“$t2abc”等,我的解决方案将生成 'false positives'。
所以,更好的方法是将第一个不可见字符替换为 0,然后比较完整大小,如下所示:
char *tmp_reg = reg;
while (tmp_reg++)
{
if (tmp_reg < ' ') // is invisible?
{
*tmp_reg = 0; // replace invisible to 0
break; // we don't need to compare more
}
}
// ....
else if (strcmp("$t2", reg)) == 0)
{
return r10;
}
我试图从 TXT 文件中获取每一行,然后将该行传递给变量,我将在 if 语句中匹配这些变量。我的 txt 文件是:
add $t0, $t1, $t2
addi $t0, $t1, 30352
它正确地删除了逗号并将“add”、“$t0”、“$t1”、“$t2”发送到它们各自的变量,然后使用 if 语句将它们转换为二进制表示。它适用于除 $t2 之外的每个变量,因为存在某种隐藏的换行符,我一生都无法弄清楚如何删除。我的 if 语句看起来像
else if(strcmp("$t2", reg) == 0)
{
return r10;
}
应该返回 01010 但永远不会计算为真。
如何清除 C 中的换行符?
更新:这是我阅读文件的方式
FILE *fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
void sendLine()
{
//Open file, check it's not empty
fp = fopen("mymipsfile.txt", "r");
if (fp == NULL)
{
exit(EXIT_FAILURE);
}
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu:\n", read);
printf("%s", line);
remove_all_chars(line, ',');
interpertLine(line);
decodeLine(0);
printf("\n");
}
fclose(fp);
if (line)
{
free(line);
}
exit(EXIT_SUCCESS);
}
这是我如何将它拆分成变量
void interpertLine(char currentLine[])
{
//Extract the first token
char * token = strtok(currentLine, " ");
op = token;
//Loop through the string to extract all other tokens
int i = 0;
while( token != NULL ) {
//printf( " %s\n", token ); //printing each token
token = strtok(NULL, " ");
if(i == 0)
{
rs = token;
}
else if (i == 1)
{
rt = token;
}
else if (i == 2)
{
rd = token;
}
i++;
}
}
简单地将比较长度限制为可见字符:
else if (strncmp("$t2", reg, sizeof("$t2") - 1) == 0)
{
return r10;
}
注意 1:我使用 'sizeof() - 1' 来防止比较尾随的空终止字节 (0),存在于每个字符串文字“....”的末尾“....”
注意 2:如果 'reg' 指向任何以“$t2”开头的字符串,例如:“$t20”、“$t2abc”等,我的解决方案将生成 'false positives'。 所以,更好的方法是将第一个不可见字符替换为 0,然后比较完整大小,如下所示:
char *tmp_reg = reg;
while (tmp_reg++)
{
if (tmp_reg < ' ') // is invisible?
{
*tmp_reg = 0; // replace invisible to 0
break; // we don't need to compare more
}
}
// ....
else if (strcmp("$t2", reg)) == 0)
{
return r10;
}