【问题标题】:read a file .txt in a C program在 C 程序中读取文件 .txt
【发布时间】:2017-08-31 17:03:46
【问题描述】:

我正在用 C 语言编写一个并行 openmp,并使用此代码从 .txt 文件中读取一百万条数据。

 FILE *data = NULL;
 data = fopen("1millon.txt","r");

float ID, n, cord[1000000],cordy[1000000];
int ale = 1000000;  
for(i=0;i<ale;i++){

fscanf (data, "%f %f", &ID, &n);
    cordx[i]=ID;
    cordy[i]=n;
} 

实际上,当我在普通计算机上运行我的程序时,这个“fscanf”运行良好。但是,如果我想在集群中运行它以进行并行化,它将向我显示下一个警告 (警告:忽略“fscanf”的返回值,用属性warn_unused_result [-Wunused-result]声明 fscanf (data, "%f %f", &ID, &n); ) 而且它不会运行。”

你知道另一种读取 .txt 文件而不是“fscanf”、“fread”的方法吗?

谢谢

【问题讨论】:

  • 1. “它不起作用”不足以描述这种情况。程序没有编译或运行不正常? 2. ID 和 n 被声明为整数,但您的 scanf 将它们视为浮点数。真是太神奇了,在任何地方都很顺利。 3. 可以添加cordx和cordy的定义吗?
  • 不要将浮点数读入整数 - 它不会顺利进行。
  • printf() 输出 ID 和 n 在您阅读它们时。那是一种“标准”测试/调试检查。除非你做这些事情,或者使用真正的调试器,否则你不会进步..
  • 程序在我的操作系统中作为顺序算法正常运行,我的问题是我不能使用“fscanf”读取集群中的数据来测试像openmp这样的并行编程。
  • 它可能给人一种运行正常的印象,但你的程序并不正确。另外,您的程序是否无法编译运行

标签: c


【解决方案1】:

fscanf()返回一些东西。它应该可以帮助您发现问题和特殊情况。您的集群配置为抱怨这一点。您自己的 PC 没有这样配置,因此它不会发出警告。

为了避免集群上的警告,不要忽略返回值。 IE。检查是否匹配成功。

或者使用(void) fsanf... 告诉编译器“我故意忽略有用的返回值。”。

根据opengroup fscanf manpages(在返回值部分中),当您成功读取您的两个float 值时,您应该期望您对fscanf 的调用返回2:

成功完成后,这些函数返回成功匹配和分配的输入项的数量;如果发生早期匹配失败,此数字可以为 0。

如果它返回少于两个,则需要额外的工作来丢弃错误输入(参见下面的一个很好的例子),退出进程或以其他方式处理错误。否则,您以后对fscanf 的调用将因stdin 留下未读的相同垃圾而失败。

if (fscanf(data, "%f %f", &ID, &n) != 2) {
    fscanf(data, "%*[^\n]"); // read and discard up to the next newline character
    fgetc(data);             // ... and discard the newline character, too
    /* XXX: What to do with cordx[i] and cordy[i]? */
}

【讨论】:

  • @Seb 谢谢,很好的附加信息。 (它可能给我带来了一些声誉。)
  • 你的回答很好,足以在我的书里打勾;没有必要重写它来添加细节。此外,我真的不需要代表。我正在追逐徽章 atm ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多