好的,我正在制作的程序中有以下代码
names.txt包含以下内容:
PersonA.txt
PersonB.txt
PersonC.txt
然后,为了将它们存储到数组中,这就是我正在做的事情:
FILE* fnames;
fnames=fopen("names.txt","r");
nlines=file_lines(fnames); // function I made to calculate lines (working)
f_array[nlines][29]; // 29 just a ramdom number for the length of person
for(i=0; i < nlines; i++)
{
fgets(f_array[i], 29, fnames);
printf("file name: %s\n", f_array[i];
}
然而输出只是像
那样file name: random letters squares and question marks
file name: (same)
file name: (same)
我没有找到这个发生的原因,因为我有其他类似的fgets 工作得很好。
////////解决////////
感谢您提供解决方案,但是,现在又出现了一个小问题
即使文件名正确存储在数组中,我似乎无法做到这一点:
for(i=0, i < nlines, i++)
f=fopen(f_array[i], "r");
.
.
.
如果我切换到f = fopen(“PersonA.txt”,“r”),其余代码将正常工作(只为此文件做所有事情)。我的观点是让它适用于名称在f_array
中的所有文件答案 0 :(得分:0)
因为在函数file_lines
中,您已遍历文件以计算行数,FILE*
现在指向文件末尾的位置。
您需要rewind
fseek
的{{1}}到文件的开头才能再次阅读。
在file_lines
函数结束时,将这两行中的一行放在for循环之前或更好:
fseek(fnames, 0, SEEK_SET); // same as rewind()
rewind(fnames); // same as fseek(fp, 0, SEEK_SET)
如果您的程序在调用函数file_lines
之前已读取该文件,
您需要在file_lines
long original_offset = ftell(fnames);
然后在file_names
fseek(fnames, original_offset, SEEK_SET);
或者,您可以在第一次迭代时读取文件名。