使用'/ n'从文本文件中读取

时间:2013-10-13 10:08:55

标签: c string printf newline

好。所以我正在阅读并将文本文件中的文本存储到char数组中,这是按预期工作的。但是,文本文件包含许多换行符转义序列。那么问题是,当我用存储的文本打印出字符串数组时,它会忽略这些换行序列并简单地将它们打印为“\ n”。

这是我的代码:

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”作为实际的换行符转义序列,或者我只是需要从我的文本文件中删除它们并找出其他方法来分隔我的文本?

2 个答案:

答案 0 :(得分:5)

没有。事实是\n是编译器的特殊转义序列,它将其转换为单个字符文字,即“LF”(换行,返回),具有ASCII代码0x0A。因此,它是编译器,它为该序列赋予特殊含义。

相反,当从文件中读取时,\n被读作两个不同的字符,ASCII码0x5c,0x6e

你需要编写一个例程来替换\\n的所有出现(由字符\和n组成的字符串,双重转义是必要的,以告诉编译器不要将它解释为转义序列){ {1}}(单个转义序列,表示新行)。

答案 1 :(得分:2)

如果您只打算替换' \ 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的第一个参数传递,这将导致各种有趣的东西。