从文件中读取字符串

时间:2016-11-27 01:37:32

标签: c

好的,我正在制作的程序中有以下代码

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

中的所有文件

1 个答案:

答案 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);

或者,您可以在第一次迭代时读取文件名。