Запись половины массива int в новый текстовый файл - PullRequest
1 голос
/ 01 мая 2020

В моей программе я пытаюсь открыть текстовый файл, указанный в командной строке, а затем создает два новых текстовых файла values1.txt и values2.txt. Файл из командной строки содержит 100 уникальных целых чисел. Половина чисел копируется в values1.txt, другая половина копируется в values2.txt.

Однако, когда я попытался сделать это для values1.txt, я получил следующие значения:

101
32758
0
0
176197744
32764
3
0
176197728
32764
0
0
-78325960
32758
0
0
1
0
-78326000
32758
0
0
1700966438
0
-78325096
32758
176197896
32764
176197952
32764
-78326000
32758
0
0
-80547345
32758
0
0
176197952
32764
0
0
0
0
0
0
-78326000
32758
-82942073
32758
8

Вот мой код:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int cfileexists(const char * filename){
    /* try to open file to read */
    FILE *file;
    if (file = fopen(filename, "r")){
        fclose(file);
            return 1;
    }   
} 

int main(int argc,char*argv[]){
    char *p= argv[1];
    int numArray[100];
    int i=0;
    int sum1arr[50];
    int sum2arr[50];

    if (! cfileexists(p)){
        printf("Error, unable to locate the data file %s\n", p);
        return 100;
    }
    for(i;i<100;i++){
        FILE *stream=fopen(p,"r");
        while(!feof(stream)){

        fscanf(stream,"%d",&numArray[i]);

        }
        FILE * fPtr = NULL;
        fPtr = fopen("values1.txt", "w");
        for(int j=0;j<50;j++){
            fprintf(fPtr,"%d\n",numArray[j]);
        }
    }
}

Для сравнения ; это исходный текстовый файл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Оператор for имеет слишком много циклов, вы также должны использовать цикл чтения, также вы можете использовать fscanf return, чтобы убедиться, что файл достигает своего конца. Если вам не нужно сохранять значения, которые вы можете даже использовать в singe int, чтобы временно сохранить значение до его записи.

Вот возможная реализация с комментариями:

Live демо

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cfileexists(const char *filename) 
{
    /* try to open file to read */ 
    FILE *file;
    if ((file = fopen(filename, "r")))
    {
        fclose(file);
        return 1;
    }   
    return 0; //return 0 if file not found
}

int main(int argc, char *argv[])
{   
    if(argc != 2){      //check number of arguments
        puts("Wrong number of arguments");
        return(EXIT_FAILURE);  //EXIT_FAILURE macro is more portable
    }

    FILE *stream;    
    FILE *fPtr = NULL;
    FILE *fPtr2 = NULL;

    int numArray[100];
    int i = 0;

    fPtr = fopen("values1.txt", "w");
    fPtr2 = fopen("values2.txt", "w");

    //you can use fopen to check file nstead of the 
    //function, it returns null if no file is opened
    if (!(stream = fopen(argv[1], "r")))
    {
        perror("Error, unable to locate the data file"); //also prints error signature
        return EXIT_FAILURE;
    }
    //check input, stop when there is nothing else to read
    while (fscanf(stream, "%d", &numArray[i]) == 1 && i < 100) 
    {
        if(i < 50)
            fprintf(fPtr, "%d\n", numArray[i]); //write to file 1
        else
            fprintf(fPtr2, "%d\n", numArray[i]); //write to file 2
        i++;
    }
    fclose(stream);
    fclose(fPtr);
    fclose(fPtr2);
}
0 голосов
/ 01 мая 2020

Вот другой подход, который использует getline():

#include <stdio.h>
#include <stdlib.h>

#define SPLIT_POINT 50

int main(void) {
    char filename[] = "test";
    FILE *fp = fopen(filename, "r");
    if (!fp) {
        fprintf(stderr, "Couldn't open %s\n", filename);
    }

    // Check file open (as above) left out for brevity
    FILE *out1 = fopen("values1.txt", "w");
    FILE *out2 = fopen("values2.txt", "w");
    char *line = NULL;
    size_t n = 0, i = 0;
    ssize_t len = 0;
    while ((len = getline(&line, &n, fp)) != EOF) {
        // Select which output file to write to
        FILE *out = i < SPLIT_POINT ? out1 : out2;

        // getline includes the newline - remove this
        if (i == SPLIT_POINT - 1 && len > 0) {
            line[--len] = 0;
        }
        // Write to the relevant output file
        fprintf(out, "%s", line);
        i++;
    }
    fclose(fp);
    fclose(out1);
    fclose(out2);
    free(line);
    return 0;
}

Если вам не нужно удалять переводы строки, вы можете упростить вызов getline() - просто не беспокойтесь о len переменная.

...