我在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'。 相反,如果我只是通过复制和粘贴数据来创建文本文件,它就可以工作。你能解释一下为什么吗?谢谢!
答案 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');
很好!