脚本只读取偶数行文件

时间:2014-11-19 20:31:08

标签: c

我在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"行数?

2 个答案:

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

我猜测您收到运行时错误的原因是您用于字符串(nojmphon)的字符数组不够长处理文本文件中的某些条目,因此内存被覆盖。尝试增加您使用的长度,以确保它大于您在文本文件中遇到的最长字符串。

另一种可能性是,您的阵列中没有足够的项目来读取文本文件中的所有数据。在这里,我有一个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++;
}

所以你:

  1. 使用fscanf()
  2. 阅读
  3. 使用fscanf()
  4. 阅读
  5. 打印您阅读的内容
  6. 因此,您只打印第二个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