我在C中有一个脚本,它读取的文件结构如下:
1,example,2,3;
2,exampl,3,5;
3,examp,7,4;
4,exam,9,1;
脚本在这里:
while(fscanf(fptr,"%d,%[^/,],%d,%s", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon) != EOF) {
fscanf(fptr,"%d,%[^/,],%d,%s;", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon);
printf("%d,%s,%d,%s\n", m[i].id,m[i].nojm,m[i].salar,m[i].phon);
i++;
}
我遇到的问题是,它只能读取文件的偶数行(第2,第4,第6,第8)......
我应该如何编辑代码以便读取所有行?
感谢您的帮助。
UPDATE1:
void nacti(emp *p,int n)
{
FILE *fptr;
fptr=fopen("ulozka.txt","r");
if(fptr==NULL){
printf("Error opening file!");
getchar();
}
typedef struct
{
int id;
char nojm[32];
int salar;
char phon[32];
} data_t;
int i = 0;
data_t m[4];
while(fscanf(fptr,"%d,%[^/,],%d,%s", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon) != EOF) {
printf("%d,%s,%d,%s\n", m[i].id,m[i].nojm,m[i].salar,m[i].phon);
i++;
}
printf("%d,%s,%d,%s\n", m[4].id,m[4].nojm,m[4].salar,m[4].phon);
//printf("%d",pocet);
}
如果只有m [4],代码只会读取4行文件?我该如何编辑它以阅读" indefinit"行数?
答案 0 :(得分:1)
您的代码应替换为以下内容:
while(fscanf(fptr,"%d,%[^/,],%d,%s", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon) != EOF) {
printf("%d,%s,%d,%s\n", m[i].id,m[i].nojm,m[i].salar,m[i].phon);
i++;
}
while循环条件中的fscanf
调用将在每次循环迭代时执行,因此您不需要在循环内再次调用它。
<强>更新强>:
以下解决方案适合我。 You can try it here
#include <stdio.h>
typedef struct
{
int id;
char nojm[32];
int salar;
char phon[32];
} data_t;
int main(void) {
int i = 0;
data_t m[4];
while(fscanf(stdin,"%d,%[^/,],%d,%s", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon) != EOF) {
printf("%d,%s,%d,%s\n", m[i].id,m[i].nojm,m[i].salar,m[i].phon);
i++;
}
return 0;
}
我猜测您收到运行时错误的原因是您用于字符串(nojm
和phon
)的字符数组不够长处理文本文件中的某些条目,因此内存被覆盖。尝试增加您使用的长度,以确保它大于您在文本文件中遇到的最长字符串。
另一种可能性是,您的阵列中没有足够的项目来读取文本文件中的所有数据。在这里,我有一个4项的静态数组,以支持文本文件中的4项。如果您的文本文件包含10,000个项目,则需要确保已正确分配内存以存储所有内容。
答案 1 :(得分:0)
你有
while(fscanf(fptr,"%d,%[^/,],%d,%s", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon) != EOF) {
fscanf(fptr,"%d,%[^/,],%d,%s;", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon);
printf("%d,%s,%d,%s\n", m[i].id,m[i].nojm,m[i].salar,m[i].phon);
i++;
}
所以你:
fscanf()
fscanf()
因此,您只打印第二个fscanf读取的内容。删除第二个,你应该没事。
所以,你的代码应该是这样的:
while(fscanf(fptr,"%d,%[^/,],%d,%s", &m[i].id,m[i].nojm,&m[i].salar,m[i].phon) != EOF) {
printf("%d,%s,%d,%s\n", m[i].id,m[i].nojm,m[i].salar,m[i].phon);
i++;
}
我发现编译代码时遇到问题。我怀疑你的代码与我的例子相关,它可能会有所帮助。
#include <stdio.h>
#include <string.h>
/* Define the struct before main. */
struct person {
char phon[20];
int id;
};
// Give a synonym. Now struct person is the same with person_t.
typedef struct person person_t;
int main(void) {
person_t array[3]; // can hold 3 persons
FILE* fptr = NULL;
fptr = fopen("test.txt", "r");
int i = 0;
while (fscanf(fptr, "%d, %s", &array[i].id, array[i].phon) != EOF) {
printf("%d, %s\n", array[i].id, array[i].phon);
i++;
}
return 0;
}
和test.txt
1, 697555555
2, 697888888
3, 694777777