我正在尝试读取一个文件,每行都有一个名字,比如 吉姆 艾比 蒂莫西 并将每个名称存储在一个数组中的一个位置,以便我以后可以使用每个单独的名称。这是我的代码,但我不认为名称存储正确,因为如果我更改文件中名称的顺序,名称上的操作也会更改。操作取决于名称,而不是位置。
FILE *ptr_file; // pointer to file
char name[100];
size_t k=0;
ssize_t read;
char *line = NULL;
while ((read= getline(&line, &k, ptr_file))!=-1)
{
fscanf(ptr_file, "%s", &name);
printf("%s ",name);
}
`我正在尝试用名称
做这样的事情 for (i =0; i <length-1; i++)
//for the length of the string add each letter's value up
{
num = num + name [i];
}
但是当我在列表中切换名称的位置时,num的值也会改变。
答案 0 :(得分:0)
也许是这样的。在此代码中,我假设文件中的名称少于200个。你可以通过改变&#34;名称&#34;的大小来改变它。阵列
FILE *ptr_file; // pointer to file
char names[200][100];
size_t k=100;
size_t namesCount = 0;
size_t read;
while ((read= getline(names[namesCount], &k, ptr_file))!=-1) //reading name to names array
{
printf("%s ",names[namesCount++]);//printf just readed name
}
答案 1 :(得分:0)
getline()在传递NULL
指针时为您执行内存分配。
我已经对代码进行了评论以供解释。
#include <stdio.h>
#include <stdlib.h>
#define THRESHOLD (5)
int main(int argc,char** argv) {
// the file containing the names (one in each line)
char* fn = "test";
// lets open the file (you should check the result!)
FILE* file = fopen(fn,"r");
// allocate memory for the array
char** names = (char**)malloc(THRESHOLD * sizeof(char*));
size_t i;
// set all the values to NULL
for(i=0; i<THRESHOLD; i++) {
names[i] = NULL;
}
// initialize the count
size_t count = 0;
// read all names until EOF and resize the array if needed
while(getline(&names[count],&i,file) != EOF) {
count++;
if(count >= THRESHOLD) {
names = (char**)realloc(names,(count+THRESHOLD)*sizeof(char*));
}
}
// resize (shrink) the array to the actual size
names = (char**)realloc(names,count * sizeof(char*));
// do something with the names (i just print them)
for(i=0; i<count; i++) {
printf("element %d, value %s",i,names[i]);
}
// you have to free the memory (allocated by getline)
for(i=0; i<count; i++) {
free(names[i]);
}
// you have to free memory (allocated by you)
free(names);
return 0;
}
答案 2 :(得分:0)
很难看出你的意思,但看起来你有两个基本的逻辑问题(忽略其他答案中突出显示的具体技术要点)。
1)代码使用getline
读取一行,丢弃 line
中的结果,然后立即使用fscanf
从文件中读取更多文本。< / p>
2)fscanf
从文件中读取的每个名称都会覆盖 name
缓冲区,该缓冲区是一个最多99个字符的字符串加上一个NULL终止符。< / p>
当您来处理缓冲区时,它将仅包含通过调用fscanf
读取的姓氏,或者如果文件中有零行或一行则为无意义。此外,fscanf
格式参数"%s"
告诉fscanf读取第一个空格(包括制表符或换行符)字符的字符串,这对于简单名称可能很好,但如果你想要第一个和第二个字符则不行名。
这意味着更改文件的顺序可能会更改在读取文件的例程结束时name
缓冲区中的名称。这就是num
的价值不同的原因。