从C中的文本文件中读取\n作为真正的换行符

从C中的文本文件中读取\n作为真正的换行符,c,fgets,getline,C,Fgets,Getline,我正在尝试用C来读取文本文件。文本文件是一个简单的语言文件,它在嵌入式设备中工作,文件的每一行在代码端都有一个枚举。以下是我的文件的一个简单部分: 文本文件中的示例: OPERATION SUCCESS! OPERATION FAILED!\nRETRY COUNT : %d 枚举: typedef enum { ... MESSAGE_VALID_OP, MESSAGE_INVALID_OP_WITH_RETRY_COUNT

我正在尝试用C来读取文本文件。文本文件是一个简单的语言文件,它在嵌入式设备中工作,文件的每一行在代码端都有一个枚举。以下是我的文件的一个简单部分:

文本文件中的示例:

 OPERATION SUCCESS!
 OPERATION FAILED!\nRETRY COUNT : %d
枚举:

   typedef enum
   {
    ...
           MESSAGE_VALID_OP,
           MESSAGE_INVALID_OP_WITH_RETRY_COUNT
    ...
   }
加载字符串:

typedef struct
{
    char *str;
} Message;

int iTotalMessageCount = 1012;

void vLoadLanguageStrings()
{
    FILE *xStringList;
    char * tmp_line_message[256];
    size_t len = 0;
    ssize_t read;
    int message_index = 0;

    xStringList = fopen("/home/change/strings.bin", "r");

    if (xStringList == NULL)
        exit(EXIT_FAILURE);

    mMessages = (Message *) malloc(iTotalMessageCount * sizeof(Message));

    while ((read = fgets(tmp_line_message, 256, xStringList)) != -1 && message_index < iTotalMessageCount)
        {
            mMessages[message_index].str = (char *) malloc(strlen(tmp_line_message));
            memcpy(mMessages[message_index].str, tmp_line_message, strlen(tmp_line_message) -1);
            message_index++;
    }

    fclose(xStringList);
}
typedef结构
{
char*str;
}信息;
int iTotalMessageCount=1012;
void vLoadLanguageString()
{
文件*xStringList;
字符*tmp_行_消息[256];
尺寸长度=0;
阅读;
int message_index=0;
xStringList=fopen(“/home/change/strings.bin”,“r”);
if(xStringList==NULL)
退出(退出失败);
mMessages=(Message*)malloc(iTotalMessageCount*sizeof(Message));
while((read=fgets(tmp_line_message,256,xStringList))!=-1&&message_index
在文本文件的示例中,我必须在一些行中使用\n换行符。毕竟,我成功地阅读了这个文件。但如果我试图调用包含提要行\n的文本,则提要行字符将作为\&n字符打印在设备屏幕上

我已经尝试了
getline(…)
方法。如何处理\n字符而不增加复杂性并逐行读取文件

当您从文本文件中提取样本时,我必须使用\n提要行 我的一些台词中有一个字符

不,我看不出来。或者至少,我没看到你这么做。双字符序列
\n
主要对C编译器有重要意义;它在数据文件中没有固有的特殊意义,无论这些文件是否被C程序使用

实际上,如果系统将换行符识别为换行符,那么根据定义,不可能在物理行中嵌入文字换行符。看起来您试图做的是将换行符编码为“\n”字符序列。这很好,但它与嵌入换行字符本身完全不同

但毕竟,我成功地阅读了这个文件。 但是如果我尝试调用包含提要行的文本\n,提要行 刚刚在设备屏幕上打印的字符为\&n个字符

当然。这些是你读入的字符(不是换行符),所以如果你把它们写出来,你就可以复制它们。如果您是通过该字符序列对换行符进行编码,那么您的程序必须对该序列进行解码,如果您希望它在原处输出文字换行符

我已经尝试了getline(…)方法。如何处理\n字符 不增加复杂性,逐行读取文件


您需要处理读取的每一行以解码其中的\n序列。我将为此编写一个函数。但是,无论如何,您的程序都会更加复杂,因为当前版本并不能完成所有需要完成的操作。

首先,函数fgets返回一个指针,而不是一个数值!这不是问题所在。我已经尝试了很多东西,这是getline方法的回归。不要认为…请关注主要问题…我的意思是如果我尝试使用“操作失败\nRETRY COUNT:%d'对于在我的屏幕上显示消息…在C语言中,出现在代码中的字符串文本中的
\n
序列被编译器解释为单个字符,即换行符。当您使用
getline
fgets
从文件中将其作为字符串读取时,它将被读取为两个字符,\n和
n
。您可能需要对阅读的每一行进行后期处理以翻译序列。函数:
fgets()
返回一个
char*
而不是任何数字,包括not-1。因此,代码基本上是错误的,建议阅读并理解所用系统功能的手册页。注:
read
是一个众所周知的系统函数名。语句:
while((read=fgets(tmp\u line\u message,256,xStringList))!=-1&&message\u index
最好写成:
while(fgets(tmp\u line\u message,256,xStringList)&&message\u index
,在阅读另一行之前,应该检查
消息\u索引
。因此我已经觉得没有办法直接从文本文件中使用。必须为每一行使用类似decodeFeedLines的函数。谢谢你的回答