C程序无法识别' \ n'在从MATLAB导出的文件中

时间:2015-07-06 14:52:58

标签: c matlab newline

我在MATLAB中有一个矩阵G,我使用:

将其打印到文本文件中
file = fopen('G.dat','w');
fprintf(file, [repmat('%f\t', 1, size(G, 2)) '\n'], G'); 
fclose(file);

此矩阵的尺寸为100 x 500.如果我使用awk计算行数和列数,例如,使用

cat G.dat | awk '{print NF}END{print NR}' 

我看到尺寸与原始尺寸相对应。

现在,我想从C程序中读取这个文件G.dat,该程序计算第一行的列只是为了理解列'维度如下:

    while (!feof(file) && (fscanf(file, "%lf%c", &k, &c) == 2) ) {
        Ng++; 
        if (c == '\n') 
            break;
}

不幸的是,它给了我Ng = 50000并且它不能识别任何' \ n'。 相反,如果我只是通过复制和粘贴数据来创建文本文件,它就可以工作。你能解释一下为什么吗?谢谢!

4 个答案:

答案 0 :(得分:1)

你在Windows工作吗?尝试在文本模式下打开输出文件:

foreach (DataRow row in dt.Rows)
{
    bytes = (byte[])row["varb"];
}

这将在写入文件时自动在每个换行符之前插入回车符。

答案 1 :(得分:0)

如果我正确理解了matlab语法,那么对于3x2矩阵,这会扩展为类似%f\t%f\t%f\t\n\%f\t%f\t%f\t\n的格式字符串。请注意每行末尾的额外\t。如果此假设正确,则行中的最后一次fscanf()调用会将最后\t分配给&c。下一个fscanf()来电只会跳过\n,因为它与您的格式不匹配。

我建议您使用fgets()代替阅读每一行,然后使用strtok()循环覆盖字段,并使用atof()读取值,例如

char buf[8192];
if (fgets(buf, 8192, file))
{
    if (strtok(buf, '\t'))
    {
        ++Ng;
        while (strtok(0, '\t')) ++Ng;
    }
}
else
{
    /* error reading ... */
}

答案 2 :(得分:0)

代码的方法太脆弱了,不能“计算第一行的列只是为了理解列的维度”。 fscanf(file, "%lf%c"...太容易受到变体空白分隔符和EOL的影响,无法检测到'\n'

建议明确检查空格以确定宽度:

// return 0 on success, 1 on error
int GetWidth(FILE *file, size_t *width) {
  *width = 0;
  for (;;) {
    int ch;
    while (isspace(ch = fgetc(file))) {
      if (ch == '\n') return 0;
    }
    if (ch == EOF) return 0;
    ungetc(ch, file);
    double d;
    if (fscanf(file, "%lf", &d) != 1)) {
      return 1;  // unexpected non convertible text
    }
    (*width)++;
  }
}

//Sample, usage
size_t width;
if (GetWidth(file, &width)) return 1;

// read entire file
rewind(file);
for (size_t line = 0; foo(); line++)
  for (size_t column = 0; column<width; column++) {
    double d;
    if (fscanf(file, "%lf", &d) != 1)) {
      break;  // EOF, unexpected non convertible text or input error
    }
  }
  ...
}

答案 3 :(得分:0)

Matlab将行写为

 %f\t%\f .. %f\t\n 

这是一个问题。我用过

dlmwrite('G.dat', G, '\t');

很好!