C 使用'读取文本文件/n';
好的。所以我从一个文本文件中读取文本并将其存储到一个字符数组中,这是按预期工作的。但是,文本文件包含许多换行符转义序列。然后,问题是,当我打印带有存储文本的字符串数组时,它会忽略这些换行符序列,而只是将它们打印为“\n” 这是我的密码:C 使用'读取文本文件/n';,c,string,printf,newline,C,String,Printf,Newline,好的。所以我从一个文本文件中读取文本并将其存储到一个字符数组中,这是按预期工作的。但是,文本文件包含许多换行符转义序列。然后,问题是,当我打印带有存储文本的字符串数组时,它会忽略这些换行符序列,而只是将它们打印为“\n” 这是我的密码: char *strings[100]; void readAndStore(FILE *file) { int count = 0; char buffer[250]; while(!feof(file)) { char *readLin
char *strings[100];
void readAndStore(FILE *file) {
int count = 0;
char buffer[250];
while(!feof(file)) {
char *readLine = fgets(buffer, sizeof(buffer), file);
if(readLine) {
strings[count] = malloc(sizeof(buffer));
strcpy(strings[count], buffer);
++count;
}
}
}
int main() {
FILE *file1 = fopen("txts", "r");
readAndStore(&*file1);
printf("%s\n", strings[0]);
printf("%s\n", strings[1]);
return 0;
}
输出结果如下所示:
此处有大量文本\n更多应该在新行上的文本,但不是\n等等\n和
和上\n
有没有办法让它把“\n”作为实际的换行符转义序列来读取,或者我只需要从文本文件中删除它们,并找出其他方法来分隔文本?没有。事实是,
\n
是编译器的一个特殊转义序列,它将它转换为一个单字符文本,即“LF”(换行,返回),具有ASCII码0x0A
。所以,编译器赋予了这个序列特殊的意义
相反,当从文件读取时,\n
被读取为两个不同的字符,ASCII码0x5c,0x6e
您需要编写一个例程,用
\n
替换所有出现的\\n
(由字符\和n组成的字符串,需要双转义以告诉编译器不要将其解释为转义序列)和\n
(单转义序列,表示新行).否。事实上,\n
是编译器的特殊转义序列,它将其转换为单字符文字,即“LF”(换行符,返回),具有ASCII代码0x0A
。所以,编译器赋予了这个序列特殊的意义
相反,当从文件读取时,\n
被读取为两个不同的字符,ASCII码0x5c,0x6e
您需要编写一个例程,用
\n
替换所有出现的\\n
(由字符\和n组成的字符串,需要双转义以告诉编译器不要将其解释为转义序列)和\n
(单转义序列,表示新行).如果只想用实际字符替换“\n”,请使用自定义替换函数,如
void replacenewlines(char * str)
{
while(*str)
{
if (*str == '\\' && *(str+1) == 'n') //found \n in the string. Warning, \\n will be replaced also.
{
*str = '\n'; //this is one character to replace two characters
memmove(str, str+1, strlen(str)); //So we need to move the rest of the string leftwards
//Note memmove instead of memcpy/strcpy. Note that '\0' will be moved as well
}
++str;
}
}
此代码未经测试,但总体思路必须清晰。这不是替换字符串的唯一方法,您可以使用自己的或其他解决方案
如果要替换所有特殊字符,最好查找一些现有实现或清理字符串,并将其作为format
参数传递给printf
。至少需要复制字符串中的所有“%”符号
不要按原样传递字符串作为
printf
的第一个参数,这会导致各种有趣的事情。如果您只想用实际字符替换'\n',请使用自定义替换函数,如
void replacenewlines(char * str)
{
while(*str)
{
if (*str == '\\' && *(str+1) == 'n') //found \n in the string. Warning, \\n will be replaced also.
{
*str = '\n'; //this is one character to replace two characters
memmove(str, str+1, strlen(str)); //So we need to move the rest of the string leftwards
//Note memmove instead of memcpy/strcpy. Note that '\0' will be moved as well
}
++str;
}
}
此代码未经测试,但总体思路必须清晰。这不是替换字符串的唯一方法,您可以使用自己的或其他解决方案
如果要替换所有特殊字符,最好查找一些现有实现或清理字符串,并将其作为format
参数传递给printf
。至少需要复制字符串中的所有“%”符号
不要按原样传递字符串作为
printf
的第一个参数,这会导致各种有趣的事情。除了神秘的全局之外,我们只能假设是一个char*[]
ptr数组,您意识到,如果发生读取错误,您会盲目地增加计数
,从而在过程中在字符串包中留下一个插槽,对吗?如果您的文本文件实际上包含一个反斜杠字符,后跟一个n
(两个字符),不要指望fgets
会神奇地为您翻译。不会。此外,您不检查fopen
是否成功。如果它返回NULL
(比如说因为文件不在那里),那么以后当您尝试使用file1
时,您会有未定义的行为。只在文件中存储实际的换行,而不是转义序列,会更有意义。转义序列只对代码中的字符串有意义,编译器在其中转换它们。@WhozCraig,我没有意识到这一点,没有必要对它大惊小怪。@Baldrick Hallow以这种方式存储它可能有一个完全合理的原因。可能需要的是,无论使用何种机制,都不存在真正的新词,现在他只需要将它们变回原来的自己。我见过类似的。这并不常见,但肯定不是闻所未闻。除了神秘的全局,我们只能假设是一个char*[]
ptr数组,您意识到在发生读取错误的情况下,您会盲目地增加count
,从而在过程中在字符串包中留下一个插槽,对吗?如果您的文本文件实际上包含一个反斜杠字符,后跟一个n
(两个字符),不要指望fgets
会神奇地为您翻译。不会。此外,您不检查fopen
是否成功。如果它返回NULL
(比如说因为文件不在那里),那么以后当您尝试使用file1
时,您会有未定义的行为。只在文件中存储实际的换行,而不是转义序列,会更有意义。转义序列只对代码中的字符串有意义,编译器在其中转换它们。@WhozCraig,我没有意识到这一点,没有必要对它大惊小怪。@Baldrick Hallow以这种方式存储它可能有一个完全合理的原因。可能需要的是,无论使用何种机制,都不存在真正的新词,现在他只需要将它们变回原来的自己。我见过类似的。不是