我有一个包含双数据的.txt文件。每个都在一个新的行。 我将要从文件中读取两次 - 一个用于计算文件的数量,另外两个用数据填充数组。所以我这样做了:
#include <stdio.h>
char name[30];
scanf ("%s", name);
FILE *file = fopen (name, "r");
if (!file)
{
printf ("Cannot read from file %s!\n", name);
return 1;
}
double results;
int size = 0;
while ( fscanf (plik, "%lf", &results) != EOF)
{
size++;
}
//and here I have how many numbers is in the file
double numbers[size];
for (int i=0; i<size; i++)
{
fscanf (plik, "%lf\n", &numbers[i]);
}
for(int i = 0; i < size; i++)
{
printf("%lf\n" , numbers[i]);
}
但它没有用 - 结果只有0.000000,数量为6510(这么多)。任何人都可以帮忙吗?
答案 0 :(得分:1)
正如Chris所指出的,当你在第一遍中读取文件时,fscanf会移动文件指针。因此,你不会在第二次通过中阅读任何内容。我假设所有代码都在main函数中,而plik
只是从file
复制的另一个标识符。使用fseek(file, 0, SEEK_SET)
将文件指针重置为文件的开头似乎解决了我的问题:
#include <stdio.h>
int main() {
char name[30];
scanf ("%s", name);
FILE *file = fopen (name, "r");
if (!file)
{
printf ("Cannot read from file %s!\n", name);
return 1;
}
double results;
int size = 0;
FILE *pFilePtr = file;
printf("file = %p\n", file);
while ( fscanf (pFilePtr, "%lf", &results) != EOF)
size++;
printf("size : %d\n", size);
double numbers[size];
fseek(file, 0, SEEK_SET);
FILE *plik = file;
for (int i=0; i<size; i++)
fscanf (plik, "%lf", &numbers[i]);
for(int i = 0; i < size; i++)
printf("%lf\n" , numbers[i]);
return 0;
}
我假设这个文件输入运行它:
~/Documents/src : $ cat testFile.txt
1.2334 2.223 3.34 4.21 5.34 6.23
~/Documents/src : $ g++ testFillArr.c
~/Documents/src : $ ./a.out
testFile.txt
file = 0x559494bdd420
size : 6
1.233400
2.223000
3.340000
4.210000
5.340000
6.230000