C:如何使FGET从文件中读取\n换行符?

C:如何使FGET从文件中读取\n换行符?,c,newline,string-formatting,fgets,C,Newline,String Formatting,Fgets,我有一个程序(控制台),我把所有的文本放在一个单独的.txt文件中 我使用fgets()从文件中读取一个字符串,但是当文件包含一个\n并且我稍后打印该字符串时,它会打印\n而不是换行符 以下是一个例子: FILE* fic = NULL; char str[22]; //str is the string we will use //open the file fic = fopen ("text.txt", "r"); //read from the file fgets(str, siz

我有一个程序(控制台),我把所有的文本放在一个单独的.txt文件中

我使用
fgets()
从文件中读取一个字符串,但是当文件包含一个\n并且我稍后打印该字符串时,它会打印\n而不是换行符

以下是一个例子:

FILE* fic = NULL;
char str[22]; //str is the string we will use

//open the file
fic = fopen ("text.txt", "r");

//read from the file
fgets(str, size, fic);

printf(str);
如果这是我的text.txt中的内容:

This is \n an example
然而,控制台上显示的是

This is \n an example
而不是

This is 
 an example
编辑:
在文件中,它被写为\n。我还在文件中尝试了addint\or\t,但它会打印\and\t而不是制表或单反斜杠,这是因为编译器在解析代码时会处理字符串和字符文本中的转义字符。它不是库中存在的东西,也不是所有字符串的运行时代码


如果要翻译,例如从文件中读取的两个字符
\n
,则需要在代码中自行处理。例如,通过逐个字符检查字符串并查找
'\\'
,然后查找
'n'

,这是因为编译器在解析代码时会处理字符串和字符文本中的转义字符。它不是库中存在的东西,也不是所有字符串的运行时代码


如果要翻译,例如从文件中读取的两个字符
\n
,则需要在代码中自行处理。例如,通过逐个字符检查字符串并查找
'\\'
,然后查找
'n'

fgets只将\和n视为普通字符。
您必须自己将其转换为换行字符。可能需要strstr()或类似的帮助。

fgets只将\和n视为普通字符。
您必须自己将其转换为换行字符。可能需要strstr()或类似工具的帮助。

编译器正在扫描文本文件,并将数据/文本以str字符串的形式存储。编译器不将
\n
作为转义序列。因此,如果希望在出现
\n
时转到下一行,则应逐个字符扫描,如果出现
\n
则应
printf(“\n”)

#包括
int main(){
char-str[30];
int i=0;
FILE*fic=NULL;
fic=fopen(“text.txt”,“r”);
而(!feof(fic)){
str[i++]=getc(fic);
如果(i>30){//退出循环以避免在字符串外部写入
打破
}
}
str[i-1]='\0';
fclose(fic);
对于(i=0;str[i]!='\0';i++){
如果(str[i]='n'&&str[i-1]=='\\'){
printf(“\n”);
继续;
}
如果(str[i]='\\'&&str[i+1]=='n'){
printf(“\n”);
继续;
}
printf(“%c”,str[i]);
}
返回0;
}

编译器正在扫描文本文件,并以str字符串的形式存储数据/文本。编译器不将
\n
作为转义序列。因此,如果希望在出现
\n
时转到下一行,则应逐个字符扫描,如果出现
\n
则应
printf(“\n”)

#包括
int main(){
char-str[30];
int i=0;
FILE*fic=NULL;
fic=fopen(“text.txt”,“r”);
而(!feof(fic)){
str[i++]=getc(fic);
如果(i>30){//退出循环以避免在字符串外部写入
打破
}
}
str[i-1]='\0';
fclose(fic);
对于(i=0;str[i]!='\0';i++){
如果(str[i]='n'&&str[i-1]=='\\'){
printf(“\n”);
继续;
}
如果(str[i]='\\'&&str[i+1]=='n'){
printf(“\n”);
继续;
}
printf(“%c”,str[i]);
}
返回0;
}

文件中有2个字符(
'\'
'n'
)或1个字符(
'\n'
)吗?在文件中,它写为\n我也尝试在文件中添加\\或\t,但它会打印\\,并且\t是换行符/换行符,而不是制表符或单个反斜杠。我看一点问题都没有。永远不要将来自外部源的字符串用作
printf
格式字符串!这是C中最典型的安全漏洞之一。有2个字符(
'\'
'n'
)还是1个字符(
'\n'
)在文件中?在文件中,它写为\n,我也尝试在文件中添加\\或\t,但它会打印\\,并且\t是换行符/换行符,而不是制表符或单个反斜杠。我看一点问题都没有。永远不要将来自外部源的字符串用作
printf
格式字符串!这是C.@LeonardoJeanteur中最典型的安全漏洞之一,所以它是单字符\后跟单字符n?这就是我的意思,运行时库或任何现有的标准字符串函数都不会将其转换为换行符。你得自己翻译。我看错了你的答案。对不起。我删除了我的评论,谢谢你的支持answer@LeonardoJeanteur所以是单字符\后跟单字符n?这就是我的意思,运行时库或任何现有的标准字符串函数都不会将其转换为换行符。你得自己翻译。我看错了你的答案。对不起。我删除了我的评论,感谢您的回答当遇到文件结尾时,
gets()
返回
EOF
,此代码将
EOF
分配给
str[I++]
,就像它是一个字符一样。编程不好。检查
fgetc()
like
int ch=fgetc()的结果;如果(ch==EOF)中断;str[i++]=ch。顺便说一句,这里不需要feof(fic)
,因为它检测到问题太晚了。当遇到文件结尾时,
get()
返回
EOF
,此代码将
EOF
分配给
str[i++]
作为i
#include <stdio.h>

int main(){
    char str[30];
    int i = 0;
    FILE *fic = NULL;
    fic = fopen("text.txt", "r");
    while(!feof(fic)){
        str[i++] = getc(fic);
        if(i > 30){    //Exit the loop to avoid writing outside of the string
            break;
        }
    }
    str[i - 1] = '\0';
    fclose(fic);

    for(i = 0; str[i] != '\0'; i++){
        if(str[i] == 'n' && str[i - 1] == '\\'){
            printf("\n");
            continue;
        }
        if(str[i] == '\\' && str[i + 1] == 'n'){
            printf("\n");
            continue;
        }
        printf("%c",str[i]);
    }
    return 0;
}