2015-10-14 101 views
0

我有一个问题,我需要从.txt文件读取多个数组并输出最大和子数组。这里是文本文件:从一个文件中读取多个整数数组

[1, 4, -9, 8, 1, 3, 3, 1, -1, -4, -6, 2, 8, 19, -10, -11] 
[2, 9, 8, 6, 5, -11, 9, -11, 7, 5, -1, -8, -3, 7, -2] 
[10, -11, -1, -9, 33, -45, 23, 24, -1, -7, -8, 19] 
[31,-41, 59, 26, -53, 58, 97, -93, -23, 84] 
[3, 2, 1, 1, -8, 1, 1, 2, 3] 
[12, 99, 99, -99, -27, 0, 0, 0, -3, 10] 
[-2, 1, -3, 4, -1, 2, 1, -5, 4] 

我无法弄清楚如何读取整数,并放置在单独的数组,所以我可以在我的执行功能。下面是代码(不工作),我想只是在整数阅读:

FILE *myFile 
myFile = fopen("MSS_TestProblems.txt", "r"); 

int numArray[100]; 
int i; 

for(i = 0; i < 100; i++) 
{ 
    fscanf(myFile, "%1d", &numArray[i]); 
} 

for(i = 0; i < 100; i++) 
{ 
    printf("%d", numArray[i]); 
} 

如何阅读这些整数并将它们放置在不同的阵列,这样我就可以进行操作?谢谢!

我有一个确定的最大子数组的代码,我从文件中的值加载到自己单独的阵列,然后将它们传递给该功能的过程中苦苦挣扎:

更新:我应该找到每个阵列的最大子阵列。我没有比较单独数组的最大子数组。这里是什么,我应该写一个文件的样本:

[1, 4, -9, 8, 1, 3, 3, 1, -1, -4, -6, 2, 8, 19, -10, -11] 
[8, 1, 3, 3, 1, -1, -4, -6, 2, 8, 19] 
34 

[2, 9, 8, 6, 5, -11, 9, -11, 7, 5, -1, -8, -3, 7 -2] 
[2, 9, 8, 6, 5] 
30 

[10, -11, -1, -9, 33, -45, 23, 24, -1, -7 -8, 19] 
[23,24, -1, -7, -8, 19] 
50 

[31,-41, 59, 26, -53, 58, 97, -93, -23, 84] 
[59, 26, -53, 58, 97] 
187 

[3, 2, 1, 1, -8, 1, 1, 2, 3] 
[3, 2, 1, 1] 
7 

[12, 99, 99, -99, -27, 0, 0, 0, -3, 10] 
[12, 99, 99] 
210 

[-2, 1, -3, 4, -1, 2, 1, -5, 4] 
[4, -1, 2, 1] 
6 
+1

1)代码应尝试读取' '[''2)'的fscanf(MYFILE, “%1D”,&numArray [I]);'不需要'1' 3)检查'fscanf()'的返回值。 4)代码应该查找','或最后的']'。 – chux

回答

-1

阅读与fread调用到缓存的文件中。每行爆炸缓冲区(\ n)/数组。 (计算您需要和准备多少个阵列。)按数字分解线 - 分隔符:逗号和空格。 (计数数组的长度和分配。)数字将包含符号和数字。假设数字在'0','9'范围内连续,'0'+数字给出数字的值。数字的值可以从符号,数字值及其顺序来计算。

+1

'爆炸'?这在Perl或PHP中很容易 –

+0

在C中,它意味着您必须遍历数组并在分隔符之间收集值。 =) – renonsz

+0

注意:“假设数字在0范围内连续。”9“--->假设不需要。这是要求C. – chux

2

分而治之。把任务分成几块。把每一块放到一个单独的函数中有所帮助。

无法弄清楚如何读取整数,并放置在单独的数组

只有2 int必需的数组:int读取和最佳的一个的当前数组。使用read_ints()读取一行。应用各种测试来确保数据符合预期。一种经典的方法是将一行读入缓冲区(最坏情况下可能需要100 * 40 char),然后对其进行处理。下面的内容会读取一条线段,请查找帧开始部分'['和帧尾部分']'以确保数据完整性。

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


#define StartOfFrame '[' 
#define Separator ',' 
#define EndOfFrame ']' 
#define INT_COUNT_MAX 100 

// Return number of `int` read 
// or 0 on syntax error 
// or EOF 
int read_ints(int *dest, int size, FILE *inf) { 
    int ch; 
    char delimiter = 0; 
    ch = fgetc(inf); 
    if (ch == EOF) return EOF; 
    if (ch != StartOfFrame) return 0; // unexpected text 
    int i; 
    for (i = 0; i < size; i++) { 
    if (fscanf(inf, "%d%c", &dest[i], &delimiter) != 2) return 0; 
    if (delimiter == EndOfFrame) break; 
    if (delimiter != Separator) return 0; 
    } 
    do { 
    ch = fgetc(inf); 
    if (ch == '\n' || ch == EOF) return i; 
    } while (isspace(ch)); 
    return 0; // unexpected text 
} 

OP的提供double maxSubArray(double * Array1);,但缺乏有效的int的长度。当然,该阵列可以预填充0.

在编写完整的解决方案时,各种错误检查有助于快速识别问题。

以下read_lines()将重复调用read_ints()并处理结果。

OP忽略其余部分,如果您不想看到完整的解决方案。

int read_lines(FILE *inf) { 
    int best[INT_COUNT_MAX]; 
    unsigned best_line = 0; 
    int best_count = 0; 
    long long best_sum = LLONG_MIN; 
    int a[INT_COUNT_MAX]; 
    unsigned line_count = 0; 

    int count; 
    while ((count = read_ints(a, INT_COUNT_MAX, inf)) >= 0) { 
    line_count++; 
    if (count == 0) { 
     fprintf(stderr, "Trouble reading line %u\n", line_count); 
     return 1; 
    } 
    long long sum = 0; 
    for (int i = 0; i < count; i++) { 
     sum += a[i]; 
    } 
    if (sum > best_sum) { 
     best_sum = sum; 
     best_count = count; 
     best_line =line_count; 
     memcpy(best, a, sizeof best[0] * count); 
    } 
    } 
    printf("Greatest sum:%lld on line:%u\n", best_sum, best_line); 
    fputc(StartOfFrame, stdout); 
    for (int i = 0; i < best_count; i++) { 
    if (i > 0) printf("%c", Separator); 
    printf("%d", best[i]); 
    } 
    fputc(EndOfFrame, stdout); 
    return 0; 
} 
int main(void) { 
    const char *filename = "MSS_TestProblems.txt"; 
    FILE *myFile; 
    myFile = fopen(filename, "r"); 
    if (!myFile) { 
    fprintf(stderr, "Unable to open file \"%s\"\n", filename); 
    return 1; 
    } 
    read_lines(myFile); 
    fclose(myFile); 
    return 0; 
} 

-

Greatest sum:81 on line:6 
[12,99,99,-99,-27,0,0,0,-3] 
+0

感谢您的意见!我不是在寻找最大的子阵列,而是每个单独阵列的最大子阵列。我有样本解决方案,我会在上面发布它们,所以希望它是有道理的。再次感谢! –